academia/docs/entregables/02-diseno/arquitectura/DI-001-arquitectura-backend.md

130 lines
6.0 KiB
Markdown
Raw Normal View History

# 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 |