Ricordo ancora i bei vecchi tempi dei repository. Ma i depositi sono diventati brutti nel tempo. Poi il CQRS è diventato mainstream. Erano gentili, erano una boccata d'aria fresca. Ma recentemente mi sono chiesto ripetutamente perché non mantengo la logica nel metodo Action di un controller (specialmente in Web Api dove l'azione è una sorta di comando / gestore di query in sé).
In precedenza avevo una risposta chiara per questo: lo faccio per i test poiché è difficile testare Controller con tutti quei singleton inammissibili e la brutta infrastruttura ASP.NET. Ma i tempi sono cambiati e le classi di infrastruttura ASP.NET sono molto più facili da test unitari (specialmente in ASP.NET Core).
Ecco una tipica chiamata WebApi: viene aggiunto un comando e i client SignalR ricevono una notifica al riguardo:
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à / deriderla. Inoltre, grazie a OWIN posso configurare i server WebApi e SignalR locali e realizzare un test di integrazione (e abbastanza veloce tra l'altro).
Recentemente mi sono sentito sempre meno motivato a creare ingombranti comandi Commands / Queries e tendo a mantenere il codice nelle azioni Web Api. Faccio un'eccezione solo se la logica viene 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 su Gestori e gestori di query? Ci sono dei modelli migliori?
Aggiornamento. Ho trovato questo articolo sull'approccio DDD-lite. Quindi sembra che il mio approccio nello spostare parti complicate del codice ai comandi / gestori di query possa essere chiamato CQRS-lite.