130 lines
6.0 KiB
Markdown
130 lines
6.0 KiB
Markdown
# 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 |
|