Este proyecto es una plantilla para construir aplicaciones .NET 8 bajo el enfoque de monolito modular. Cada módulo es autónomo, con su propia infraestructura, lógica de aplicación y presentación, pero todos conviven en el mismo proceso y base de código. La comunicación entre módulos se realiza mediante CQRS y eventos usando Wolverine, lo que permite desacoplar la lógica y facilitar la escalabilidad futura.
- Monolito Modular: Cada módulo (por ejemplo,
Module.User,Module.Auth) es un ensamblado independiente, pero todos se despliegan juntos en la misma aplicación. - CQRS + Event Sourcing: Los módulos se comunican mediante comandos, consultas y eventos usando Wolverine, desacoplando la lógica de negocio y la persistencia.
- Versionado de API: Gestionado con
Asp.Versioning, permitiendo múltiples versiones y evolución controlada de los endpoints. - Logging Centralizado: Uso de
LoggerManagerpara centralizar logs de debug, info, warning y error. - Persistencia Resiliente: Integración con PostgreSQL y políticas de reintento para conexiones robustas.
Cada módulo debe seguir la siguiente estructura:
- Crear la carpeta
Module.[Nombre]bajoModules. - Agregar un archivo
[Nombre]ModuleStartup.cscon un métodoAdd[Nombre]Modulepara registrar servicios, contexto y mapeos. - Definir carpetas para Application, Domain, Infrastructure y Presentation siguiendo el ejemplo de los módulos existentes.
- Registrar el módulo en
API/Extensions/ConfigurationModules.csllamando aservices.Add[Nombre]Module(config);.
- Los controladores deben estar en
Presentation/Controllersy terminar conController. - Se detectan automáticamente si cumplen con el sufijo o tienen el atributo
[Controller]. - Deben devolver respuestas usando el estándar de
ApiResponse(ver sección de Respuestas).
- Queries y Commands:
- Las clases deben terminar en
QueriesoCommands. - Deben tener el atributo
[WModuleHandler]. - Deben implementar un método público
Handle.
- Las clases deben terminar en
- Eventos:
- Los eventos se publican y consumen usando Wolverine, permitiendo integración asíncrona entre módulos.
- Descubrimiento Automático:
- El sistema escanea todos los ensamblados y registra automáticamente los handlers válidos (ver
WolverineDiscoveryExtensions.cs).
- El sistema escanea todos los ensamblados y registra automáticamente los handlers válidos (ver
- Para que un handler sea registrado:
- Debe ser una clase concreta (no abstracta).
- Nombre debe terminar en
QueryoCommand. - Decorado con
[WModuleHandler]. - Debe tener un método público
Handle.
- Ejemplo:
- Todas las respuestas deben usar el objeto
ApiResponse:- Incluye:
Message,StatusCode,Detailsy opcionalmentePagination. - Utilizar la extensión
CustomResponsepara construir respuestas uniformes.
- Incluye:
- Ejemplo:
- Configurado en
VersioningConfigure.cs. - Soporta:
- Header:
X-version - QueryString:
ApiVersion - Segmento de URL
- Header:
- La versión por defecto se define en la configuración (
API_Versioning:DEFAULT_VERSION). - Las versiones se reportan automáticamente en las respuestas.
- Usar
ILoggerManagerpara registrar logs. - Métodos disponibles:
LogDebug,LogInfo,LogWarn,LogError. - Los mensajes se truncan a 500 caracteres para evitar saturación de logs.
- Cada módulo puede tener su propio
DbContext. - Uso de PostgreSQL con políticas de reintento para conexiones resilientes.
- La cadena de conexión se define en la configuración (
StringConnection).
- Clona el repositorio.
- Crea un nuevo módulo siguiendo la estructura y reglas descritas.
- Registra el módulo en
ConfigurationModules.cs. - Implementa tus comandos, queries y eventos usando Wolverine.
- Usa el estándar de respuesta y logging.
- Configura el versionado de API según tus necesidades.
- Mantén cada módulo lo más independiente posible.
- Usa eventos para integración entre módulos.
- Versiona tus endpoints para evitar breaking changes.
- Centraliza la gestión de logs y respuestas.
Para dudas técnicas, revisa los archivos de ejemplo y la documentación inline en el código.