Ich erinnere mich immer noch an gute alte Tage der Aufbewahrungsorte. Aber Repositories wuchsen mit der Zeit hässlich. Dann wurde CQRS zum Mainstream. Sie waren nett, sie waren ein Hauch frischer Luft. Aber in letzter Zeit habe ich mich immer wieder gefragt, warum ich die Logik in der Action-Methode eines Controllers nicht richtig einstelle (insbesondere in Web Api, wo action eine Art Befehls- / Abfragehandler für sich ist).
Bisher hatte ich eine klare Antwort darauf: Ich mache es zum Testen, da es schwierig ist, Controller mit all diesen nicht verspottbaren Singletons und der insgesamt hässlichen ASP.NET-Infrastruktur zu testen. Die Zeiten haben sich jedoch geändert und ASP.NET-Infrastrukturklassen sind heutzutage viel einfacher zu testen (insbesondere in ASP.NET Core).
Hier ist ein typischer WebApi-Aufruf: Befehl wird hinzugefügt und SignalR-Clients werden darüber benachrichtigt:
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);
}
}
Ich kann es leicht testen / verspotten. Außerdem kann ich dank OWIN lokale WebApi- und SignalR-Server einrichten und einen Integrationstest durchführen (und das übrigens ziemlich schnell).
In letzter Zeit fühlte ich mich immer weniger motiviert, umständliche Befehle / Abfragen-Handler zu erstellen, und ich neige dazu, Code in Web-API-Aktionen beizubehalten. Ich mache nur dann eine Ausnahme, wenn die Logik wiederholt wird oder wirklich kompliziert ist und ich sie isolieren möchte. Aber ich bin mir nicht sicher, ob ich hier das Richtige tue.
Was ist der vernünftigste Ansatz zum Verwalten von Logik in einer typischen modernen ASP.NET-Anwendung? Wann ist es sinnvoll, den Code in die Handler für Befehle und Abfragen zu verschieben? Gibt es bessere Muster?
Aktualisieren. Ich habe diesen Artikel über den DDD-Lite-Ansatz gefunden. Mein Ansatz, komplizierte Teile des Codes in Kommandos / Queries-Handler zu verschieben, könnte also CQRS-lite heißen.