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.
Antworten:
Ist CQRS ein relativ kompliziertes und kostspieliges Muster? Ja.
Ist es Überentwicklung? Absolut nicht.
In dem Originalartikel, in dem Martin Fowler über CQRS spricht , finden Sie zahlreiche Warnungen, dass CQRS nicht verwendet wird, sofern dies nicht zutreffend ist:
Mein Schwerpunkt oben.
Wenn Ihre Anwendung CQRS für alles verwendet, ist es nicht CQRS, das überarbeitet wurde, sondern Ihre Anwendung. Dies ist ein hervorragendes Muster zur Lösung einiger spezifischer Probleme, insbesondere von Anwendungen mit hoher Leistung und hohem Volumen, bei denen die gleichzeitige Verwendung von Schreibvorgängen ein Hauptproblem darstellen kann.
Und es kann nicht die gesamte Anwendung sein, sondern nur ein kleiner Teil davon.
Als Beispiel aus meiner Arbeit setzen wir CQRS in der Auftragserfassung ein, bei der wir keine Aufträge verlieren können, und wir haben Spitzenwerte, bei denen Tausende von Aufträgen zur gleichen Zeit aus verschiedenen Quellen zu bestimmten Zeiten eingehen. CQRS half uns dabei, das System am Leben zu erhalten und zu reagieren, und ermöglichte es uns, die Back-End-Systeme gut zu skalieren, um diese Aufträge bei Bedarf schneller (mehr Back-End-Server) und langsamer / billiger zu verarbeiten, wenn sie nicht benötigt werden.
CQRS ist ideal für das Problem, bei dem mehrere Akteure an einem Datensatz zusammenarbeiten oder auf dieselbe Ressource schreiben.
Wenn Sie ein Muster, das zur Lösung eines einzelnen Problems erstellt wurde, auf alle Ihre Probleme verteilen, entstehen Ihnen einfach mehr Probleme.
Einige andere nützliche Links:
http://udidahan.com/2011/04/22/when-to-avoid-cqrs/
http://codebetter.com/gregyoung/2012/09/09/cqrs-is-not-an-architecture-2/
quelle
CQRS ist kein Eins-zu-Eins-Ersatz für Repositorys, da es sich um ein komplexes, kostspieliges Muster handelt, das nur in einigen Fällen nützlich ist.
Hier ist, was Udi Dahan zu sagen hat:
( Quelle )
Martin Fowler:
( Quelle )
Schließlich Greg Young:
( Quelle )
quelle