Ainda me lembro dos bons e velhos tempos dos repositórios. Mas os repositórios costumavam ficar feios com o tempo. Então o CQRS se tornou popular. Eles eram legais, eram uma lufada de ar fresco. Mas, recentemente, tenho me perguntado repetidamente por que não mantenho a lógica correta no método Action do controlador (especialmente na API da Web, onde action é algum tipo de manipulador de comando / consulta).
Anteriormente, eu tinha uma resposta clara para isso: faço isso para testar, pois é difícil testar o Controller com todos esses singletons imbatíveis e a feia infraestrutura geral do ASP.NET. Mas os tempos mudaram e as classes de infraestrutura do ASP.NET são muito mais amigáveis hoje em dia, principalmente nos testes de unidade (especialmente no ASP.NET Core).
Aqui está uma chamada típica da WebApi: o comando é adicionado e os clientes SignalR são notificados sobre isso:
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);
}
}
Eu posso facilmente testar / zombar dele. Além disso, graças ao OWIN, posso configurar servidores WebApi e SignalR locais e fazer um teste de integração (e bem rápido, a propósito).
Recentemente, senti cada vez menos motivação para criar manipuladores pesados de comandos / consultas e tenho a tendência de manter o código nas ações da API da Web. Só faço uma exceção se a lógica for repetida ou for realmente complicada e eu quiser isolá-la. Mas não tenho certeza se estou fazendo a coisa certa aqui.
Qual é a abordagem mais razoável para gerenciar a lógica em um aplicativo ASP.NET moderno típico? Quando é razoável mover seu código para manipuladores de comandos e consultas? Existem padrões melhores?
Atualizar. Encontrei este artigo sobre a abordagem DDD-lite. Portanto, parece que minha abordagem de mover partes complicadas do código para manipuladores de comandos / consultas pode ser chamada de CQRS-lite.