Ricordo ancora i bei vecchi tempi dei repository. Ma i depositi diventavano brutti con il tempo. Quindi il CQRS è diventato mainstream. Erano carini, erano una boccata d'aria fresca. Ma recentemente mi sono chiesto ripetutamente perché non mantengo la logica corretta nel metodo di azione di un controllore (specialmente in Web Api in cui l'azione è una specie di gestore di comandi / query in sé).
In precedenza avevo una risposta chiara per questo: lo faccio per i test in quanto è difficile testare il controller con tutti quei singleton non smontabili e la brutta infrastruttura ASP.NET complessiva. Ma i tempi sono cambiati e al giorno d'oggi le classi di infrastruttura ASP.NET sono molto più facili da testare le unità (specialmente in ASP.NET Core).
Ecco una tipica chiamata WebApi: viene aggiunto il comando e i client SignalR ne vengono informati:
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);
}
}
Posso facilmente testare l'unità / deriderlo. Inoltre, grazie a OWIN, posso configurare i server WebApi e SignalR locali ed effettuare un test di integrazione (e piuttosto velocemente).
Di recente ho sentito sempre meno motivazione a creare ingombranti gestori di comandi / query e tendo a mantenere il codice nelle azioni di Web Api. Faccio un'eccezione solo se la logica è ripetuta o è davvero complicata e voglio isolarla. Ma non sono sicuro se sto facendo la cosa giusta qui.
Qual è l'approccio più ragionevole per la gestione della logica in una tipica applicazione ASP.NET moderna? Quando è ragionevole spostare il codice nei gestori di comandi e query? Ci sono schemi migliori?
Aggiornare. Ho trovato questo articolo sull'approccio DDD-lite. Quindi sembra che il mio approccio allo spostamento di parti complicate del codice in gestori di comandi / query possa essere chiamato CQRS-lite.