Todavía recuerdo los viejos tiempos de repositorios. Pero los repositorios solían ponerse feos con el tiempo. Luego, CQRS se hizo popular. Eran agradables, eran un soplo de aire fresco. Pero recientemente me he estado preguntando una y otra vez por qué no mantengo la lógica correcta en el método de acción del controlador (especialmente en Web Api, donde la acción es algún tipo de controlador de comando / consulta en sí mismo).
Anteriormente tenía una respuesta clara para eso: lo hago para probar, ya que es difícil probar el Controlador con todos esos singleton inamovibles y la infraestructura ASP.NET fea en general. Pero los tiempos han cambiado y las clases de infraestructura ASP.NET son mucho más amigables con las pruebas unitarias hoy en día (especialmente en ASP.NET Core).
Aquí hay una llamada típica de WebApi: se agrega un comando y se notifica a los clientes de SignalR al respecto:
public void AddClient(string clientName)
{
using (var dataContext = new DataContext())
{
var client = new Client() { Name = clientName };
dataContext.Clients.Add(client);
dataContext.SaveChanges();
GlobalHost.ConnectionManager.GetHubContext<ClientsHub>().ClientWasAdded(client);
}
}
Puedo fácilmente probarlo / simularlo. Además, gracias a OWIN puedo configurar los servidores locales WebApi y SignalR y hacer una prueba de integración (y bastante rápido).
Recientemente me sentí cada vez menos motivado para crear engorrosos manejadores de Comandos / Consultas y tiendo a mantener el código en las acciones de Web Api. Hago una excepción solo si la lógica se repite o si es realmente complicada y quiero aislarla. Pero no estoy seguro si estoy haciendo lo correcto aquí.
¿Cuál es el enfoque más razonable para administrar la lógica en una aplicación ASP.NET moderna típica? ¿Cuándo es razonable mover su código a los controladores de Comandos y Consultas? ¿Hay mejores patrones?
Actualizar. Encontré este artículo sobre el enfoque DDD-lite. Entonces parece que mi enfoque de mover partes complicadas de código a los controladores de comandos / consultas podría llamarse CQRS-lite.