6.0 KiB
6.0 KiB
DI-001: Arquitectura Backend
Proyecto: Sistema de Registro de Estudiantes Fecha: 2026-01-07
1. Patrón: Clean Architecture + CQRS
┌────────────────────────────────────────────────────────────┐
│ HOST │
│ (Program.cs, DI, Configuration) │
└─────────────────────────┬──────────────────────────────────┘
│
┌─────────────────────────▼──────────────────────────────────┐
│ ADAPTERS │
│ ┌──────────────────────┬─────────────────────────────┐ │
│ │ DRIVING (Primary) │ DRIVEN (Secondary) │ │
│ │ ────────────────── │ ───────────────────── │ │
│ │ GraphQL API │ Persistence (EF Core) │ │
│ │ (HotChocolate) │ DataLoaders │ │
│ └──────────────────────┴─────────────────────────────┘ │
└─────────────────────────┬──────────────────────────────────┘
│
┌─────────────────────────▼──────────────────────────────────┐
│ APPLICATION │
│ Commands / Queries / Handlers / Validators │
└─────────────────────────┬──────────────────────────────────┘
│
┌─────────────────────────▼──────────────────────────────────┐
│ DOMAIN │
│ Entities / Value Objects / Services / Ports │
└────────────────────────────────────────────────────────────┘
2. Regla de Dependencia
Host → Adapters → Application → Domain
↑
Adapters implementa Ports
INVIOLABLE: Domain NO depende de nada externo.
3. Responsabilidades por Capa
| Capa | Responsabilidad | Tecnología |
|---|---|---|
| Domain | Entidades, Value Objects, reglas de negocio puras, Ports (interfaces) | C# puro |
| Application | Casos de uso (Commands/Queries), DTOs, Validators, orquestación | MediatR, FluentValidation, Mapster |
| Adapters/Driving | GraphQL API (Types, Resolvers, Mutations) | HotChocolate |
| Adapters/Driven | Repositorios, DbContext, DataLoaders | EF Core, SQL Server |
| Host | Composition Root, DI, Middleware | ASP.NET Core |
4. Estructura de Proyectos
src/backend/
├── Domain/
│ ├── Entities/ # Student, Subject, Professor, Enrollment
│ ├── ValueObjects/ # Email, Credits
│ ├── Services/ # EnrollmentDomainService
│ ├── Ports/
│ │ └── Repositories/ # IStudentRepository, ISubjectRepository
│ └── Exceptions/ # MaxEnrollmentsException, SameProfessorException
│
├── Application/
│ ├── Students/
│ │ ├── Commands/ # CreateStudentCommand, UpdateStudentCommand
│ │ ├── Queries/ # GetStudentsQuery, GetStudentByIdQuery
│ │ └── DTOs/ # StudentDto, CreateStudentInput
│ ├── Enrollments/
│ │ ├── Commands/ # EnrollCommand, UnenrollCommand
│ │ ├── Queries/ # GetClassmatesQuery
│ │ └── DTOs/ # EnrollmentDto, EnrollInput
│ └── Common/
│ ├── Behaviors/ # ValidationBehavior
│ └── Mappings/ # MapsterConfig
│
├── Adapters/
│ ├── Driving/
│ │ └── Api/
│ │ ├── Types/ # StudentType, SubjectType
│ │ ├── Queries/ # QueryResolvers
│ │ └── Mutations/ # MutationResolvers
│ └── Driven/
│ └── Persistence/
│ ├── Context/ # AppDbContext
│ ├── Configs/ # StudentConfiguration
│ ├── Repos/ # StudentRepository
│ └── Seeding/ # DataSeeder
│
└── Host/
└── Program.cs # Entry point + DI
5. Flujo de una Request
1. GraphQL Request → HotChocolate Resolver
2. Resolver → Application Handler (via MediatR)
3. Handler → Validator (FluentValidation)
4. Handler → Domain Service (reglas de negocio)
5. Handler → Repository (persistencia)
6. Repository → DbContext → SQL Server
7. Response ← DTO ← Mapper ← Entity
6. Decisiones de Arquitectura
| Decisión | Razón |
|---|---|
| GraphQL vs REST | Flexibilidad en queries, evita over/under-fetching |
| HotChocolate | Mejor soporte .NET, Code-First, DataLoaders |
| MediatR | Desacopla handlers, facilita CQRS |
| Mapster | Más rápido que AutoMapper |
| FluentValidation | Validaciones declarativas y testeables |