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

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