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.
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 githubdotnet new install ./AccioData29.1.0.0.nupkgUna 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.ProjectNameEjemplo:
dotnet new hexagonal-arch --name Acme.InventoryEsto generarΓ‘ una soluciΓ³n completa con todos los proyectos renombrados automΓ‘ticamente.
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
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 β β
β βββββββββββ βββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββ
HTTP Request
β Controller (API)
β IService (Application)
β IUnitOfWork / IRepository (Ports)
β Repository + DbContext (Infrastructure)
β PostgreSQL
Response
β Entity β AutoMapper β DTO β ApiResponse<T> β HTTP Response
Edita src/Tu.Proyecto.API/appsettings.json:
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=tu_base_de_datos;Username=postgres;Password=tu_password"
}
}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.APIcd src/Tu.Proyecto.API
dotnet runLa API estarΓ‘ disponible en https://localhost:{puerto} y Swagger en https://localhost:{puerto}/swagger (solo en entorno Development).
dotnet testEl proyecto de pruebas usa una base de datos en memoria (EF Core InMemory), por lo que no requiere una instancia de PostgreSQL.
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 |
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.
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Γ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 |
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.0El workflow .github/workflows/publish.yml ejecuta dotnet pack y sube el .nupkg generado al registro de GitHub Packages de la organizaciΓ³n.
dotnet new uninstall AccioData29AccioData29