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
LoggerManager
para 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.cs
con un métodoAdd[Nombre]Module
para 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.cs
llamando aservices.Add[Nombre]Module(config);
.
- Los controladores deben estar en
Presentation/Controllers
y 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
Queries
oCommands
. - 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
Query
oCommand
. - Decorado con
[WModuleHandler]
. - Debe tener un método público
Handle
.
- Ejemplo:
- Todas las respuestas deben usar el objeto
ApiResponse
:- Incluye:
Message
,StatusCode
,Details
y opcionalmentePagination
. - Utilizar la extensión
CustomResponse
para 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
ILoggerManager
para 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.