Skip to content

Latest commit

Β 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

AccioData29 - Hexagonal Architecture Template

Template de .NET 8 para crear APIs REST siguiendo el patrΓ³n de Arquitectura Hexagonal (Ports & Adapters). Incluye una estructura de proyecto completa con capas bien definidas, manejo de excepciones, Entity Framework Core con PostgreSQL, AutoMapper, Swagger y pruebas unitarias.


InstalaciΓ³n

Desde GitHub Packages

El paquete se publica en GitHub Packages. NecesitΓ‘s un token de GitHub con permiso read:packages (generarlo aquΓ­).

InstalΓ‘ el template especificando la fuente directamente:

dotnet new install AccioData29 \
  --nuget-source "https://TU_USUARIO_GITHUB:TU_GITHUB_TOKEN@nuget.pkg.github.com/AccioData29/index.json"

O bien, agregΓ‘ la fuente una sola vez y luego instalΓ‘ normalmente:

# Paso 1 β€” agregar la fuente (una sola vez)
dotnet nuget add source \
  --username TU_USUARIO_GITHUB \
  --password TU_GITHUB_TOKEN \
  --store-password-in-clear-text \
  --name github \
  "https://nuget.pkg.github.com/AccioData29/index.json"

# Paso 2 β€” instalar el template
dotnet new install AccioData29 --nuget-source github

Desde un archivo .nupkg local

dotnet new install ./AccioData29.1.0.0.nupkg

Uso

Una vez instalado el template, crea un nuevo proyecto reemplazando Company y ProjectName con los valores de tu soluciΓ³n:

dotnet new hexagonal-arch --name Company.ProjectName

Ejemplo:

dotnet new hexagonal-arch --name Acme.Inventory

Esto generarΓ‘ una soluciΓ³n completa con todos los proyectos renombrados automΓ‘ticamente.


Estructura del proyecto generado

Tu.Proyecto/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ Tu.Proyecto.API/              # Capa de entrada HTTP (Controllers, Middlewares)
β”‚   β”œβ”€β”€ Tu.Proyecto.Application/      # LΓ³gica de negocio, interfaces, DTOs, excepciones
β”‚   β”œβ”€β”€ Tu.Proyecto.Domain/           # Entidades y enums de dominio (sin dependencias externas)
β”‚   β”œβ”€β”€ Tu.Proyecto.Host/             # ConfiguraciΓ³n e inyecciΓ³n de dependencias
β”‚   β”œβ”€β”€ Tu.Proyecto.Infraestructure/  # Repositorios, DbContext, EF Core
β”‚   β”œβ”€β”€ Tu.Proyecto.Shared/           # Respuestas genΓ©ricas y utilidades transversales
β”‚   └── Tu.Proyecto.Tests/            # Pruebas unitarias con xUnit + Moq + FluentAssertions
└── Tu.Proyecto.sln

Arquitectura

El template implementa Arquitectura Hexagonal con separaciΓ³n estricta entre el nΓΊcleo de negocio y los adaptadores externos.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Adapters                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   API   β”‚  β”‚   Tests    β”‚  β”‚  Host    β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β”‚
β”‚       β”‚              β”‚              β”‚         β”‚
β”‚  β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚              Application               β”‚  β”‚
β”‚  β”‚    (Interfaces / Services / DTOs)      β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚                 Domain                 β”‚  β”‚
β”‚  β”‚        (Entities / Enums / Rules)      β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚       β”‚              β”‚              β”‚         β”‚
β”‚  β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”             β”‚
β”‚  β”‚  Shared β”‚  β”‚Infrastructure β”‚             β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Flujo de datos

HTTP Request
  β†’ Controller (API)
  β†’ IService (Application)
  β†’ IUnitOfWork / IRepository (Ports)
  β†’ Repository + DbContext (Infrastructure)
  β†’ PostgreSQL

Response
  β†’ Entity β†’ AutoMapper β†’ DTO β†’ ApiResponse<T> β†’ HTTP Response

ConfiguraciΓ³n

Cadena de conexiΓ³n

Edita src/Tu.Proyecto.API/appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Host=localhost;Port=5432;Database=tu_base_de_datos;Username=postgres;Password=tu_password"
  }
}

Migraciones

Las migraciones se aplican automΓ‘ticamente al iniciar la aplicaciΓ³n. Para crear nuevas migraciones:

dotnet ef migrations add NombreMigracion --project src/Tu.Proyecto.Infraestructure --startup-project src/Tu.Proyecto.API

Ejecutar el proyecto

cd src/Tu.Proyecto.API
dotnet run

La API estarΓ‘ disponible en https://localhost:{puerto} y Swagger en https://localhost:{puerto}/swagger (solo en entorno Development).


Ejecutar las pruebas

dotnet test

El proyecto de pruebas usa una base de datos en memoria (EF Core InMemory), por lo que no requiere una instancia de PostgreSQL.


Endpoints de ejemplo (Product)

El template incluye un CRUD de Product como ejemplo de implementaciΓ³n:

MΓ©todo Ruta DescripciΓ³n
GET api/v1/products Listar todos los productos
GET api/v1/products/{id} Obtener producto por ID
POST api/v1/products Crear producto
PUT api/v1/products/{id} Actualizar producto
DELETE api/v1/products/{id} Eliminar producto

Respuesta estΓ‘ndar

Todas las respuestas siguen el formato ApiResponse<T>:

{
  "statusCode": 200,
  "message": "OperaciΓ³n exitosa",
  "result": { ... }
}

Los errores incluyen el campo errors con la lista de validaciones o el mensaje de excepciΓ³n.


Excepciones de dominio

El template provee excepciones tipadas que el middleware convierte automΓ‘ticamente en respuestas HTTP:

ExcepciΓ³n CΓ³digo HTTP
NotFoundException 404
DuplicateException 409
UniqueConstraintException 409
ValidationException 422

TecnologΓ­as incluidas

TecnologΓ­a VersiΓ³n PropΓ³sito
.NET 8.0 Framework base
Entity Framework Core 8.0.11 ORM
Npgsql.EntityFrameworkCore.PostgreSQL 8.0.11 Proveedor PostgreSQL
AutoMapper 13.0.1 Mapeo de objetos
Swashbuckle.AspNetCore 6.8.1 DocumentaciΓ³n Swagger/OpenAPI
xUnit 2.9.2 Framework de pruebas
Moq 4.20.72 Mocking en pruebas
FluentAssertions 8.8.0 Aserciones en pruebas

Publicar una nueva versiΓ³n

El paquete se publica automΓ‘ticamente en GitHub Packages al crear un tag con el prefijo v:

git tag v1.0.0
git push origin v1.0.0

El workflow .github/workflows/publish.yml ejecuta dotnet pack y sube el .nupkg generado al registro de GitHub Packages de la organizaciΓ³n.


Desinstalar el template

dotnet new uninstall AccioData29

Autor

AccioData29

About

πŸ—οΈ Hexagonal architecture template β€” a clean, ready-to-use starter for building maintainable applications with clear separation between domain, application, infrastructure and presentation layers.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages