Implementación de una API REST usando Arquitectura Hexagonal (Clean Architecture) con .NET 9.
lab10/
├── lab10.Domain/ # Capa de Dominio
│ ├── Entities/ # Entidades del dominio
│ │ ├── User.cs
│ │ └── Product.cs
│ └── Interfaces/ # Interfaces de repositorios
│ ├── IRepository.cs
│ ├── IUserRepository.cs
│ └── IProductRepository.cs
│
├── lab10.Application/ # Capa de Aplicación
│ ├── DTOs/ # Data Transfer Objects
│ ├── Interfaces/ # Interfaces de servicios
│ └── Services/ # Lógica de negocio
│ ├── AuthService.cs
│ └── ProductService.cs
│
├── lab10.Infrastructure/ # Capa de Infraestructura
│ ├── Data/ # DbContext
│ ├── Repositories/ # Implementación de repositorios
│ └── Configuration/ # Configuración de servicios
│
└── lab10/ # Capa de Presentación (API)
├── Controllers/ # Controladores REST
├── Configuration/ # Configuración centralizada
└── Program.cs # Punto de entrada
- ✅ Arquitectura Hexagonal (Clean Architecture)
- ✅ Patrón Repository
- ✅ JWT Authentication
- ✅ Swagger/OpenAPI Documentation
- ✅ Entity Framework Core con SQL Server
- ✅ Separación de responsabilidades en capas
- ✅ Inyección de dependencias
- ✅ DTOs para transferencia de datos
- .NET SDK 8.0 o superior
- SQL Server o SQL Server LocalDB
- Visual Studio 2022, Rider, o VS Code
dotnet restoreEdita lab10/appsettings.json para configurar tu cadena de conexión:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=Lab10DB;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}# Instalar herramientas EF Core (si no las tienes)
dotnet tool install --global dotnet-ef
# Crear migración inicial
dotnet ef migrations add InitialCreate --project lab10.Infrastructure --startup-project lab10
# Aplicar migración
dotnet ef database update --project lab10.Infrastructure --startup-project lab10dotnet run --project lab10La API estará disponible en: https://localhost:5001 o http://localhost:5000
Swagger UI: https://localhost:5001/ (página principal)
POST /api/Auth/register
Content-Type: application/json
{
"username": "testuser",
"email": "test@example.com",
"password": "password123"
}POST /api/Auth/login
Content-Type: application/json
{
"username": "testuser",
"password": "password123"
}Respuesta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"message": "Login successful"
}GET /api/Products
Authorization: Bearer {token}GET /api/Products/{id}
Authorization: Bearer {token}POST /api/Products
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "Laptop",
"description": "High performance laptop",
"price": 1200.00,
"stock": 10
}PUT /api/Products/{id}
Authorization: Bearer {token}
Content-Type: application/json
{
"name": "Updated Laptop",
"description": "Updated description",
"price": 1300.00,
"stock": 15
}DELETE /api/Products/{id}
Authorization: Bearer {token}- Ejecuta la aplicación
- Ve a
https://localhost:5001/ - Usa el endpoint
/api/Auth/registerpara crear un usuario - Usa
/api/Auth/loginpara obtener un token - Haz clic en el botón "Authorize" en Swagger
- Ingresa:
Bearer {tu-token-aqui} - Ahora puedes probar los endpoints de Products
-
Domain (Dominio)
- Entidades de negocio
- Interfaces de repositorios
- Lógica de dominio pura (sin dependencias externas)
-
Application (Aplicación)
- DTOs
- Interfaces de servicios
- Lógica de aplicación
- Casos de uso
-
Infrastructure (Infraestructura)
- DbContext (Entity Framework)
- Implementación de repositorios
- Acceso a datos
- Servicios externos
-
Presentation (API)
- Controllers
- Configuración de servicios
- Middleware
- Punto de entrada
- Repository Pattern: Abstracción del acceso a datos
- Dependency Injection: Inversión de control
- DTO Pattern: Separación entre entidades y datos de transferencia
- Service Layer: Lógica de negocio centralizada
La configuración JWT se encuentra en appsettings.json:
{
"JwtSettings": {
"SecretKey": "SuperSecretKeyForLab10Application2025!@#$%",
"Issuer": "lab10API",
"Audience": "lab10Client",
"ExpirationHours": 2
}
}- El proyecto usa SQL Server LocalDB por defecto
- La autenticación es obligatoria para todos los endpoints de Products
- Los usuarios registrados tienen rol "User" por defecto
- El hash de contraseñas es simple (para producción usar BCrypt o similar)
- Implementar Unit of Work pattern
- Agregar encriptación BCrypt para contraseñas
- Implementar paginación en listados
- Agregar validaciones con FluentValidation
- Implementar logging con Serilog
- Agregar tests unitarios
- Implementar CQRS con MediatR
Laboratorio 10 - Desarrollo de Aplicaciones Empresariales Avanzadas TECSUP 2025-I