Iam bounded Kontext mit CQRS-Muster erstellen. Ich bereitete einige Anfragen und Handler für jeden vor. Und jetzt, in Präsentationsebene (http REST-Controller) muss ich es verwenden. Frage ist, sollte ich jeden Handler diesem Controller injizieren (es gibt 4 Abfragen und Handler) oder den Befehlsbus verwenden und rechte Handler für die angegebene Abfrage konfigurieren?Wie behandeln Abfrage-Handler als Abhängigkeit?
Antwort
In der Vergangenheit haben wir eine Art Query Executor in den Controller injiziert und Anfragen dorthin weitergeleitet. zB
public SomeController(IQueryExecutor queryExecutor) { ...
und dann
var results = queryExecutor.Query(new GetSomeThings(args..));
Der Handler für GetSomeThings
wird durch die unterstützende Infrastruktur verdrahtet, so dass Sie diese nicht injizieren müssen. Ist das sinnvoll?
Ein Wort der Warnung über CQRS/CQS:
Wenn Sie finden Sie Abfragen und Handler zu schreiben, die nur einmal am meisten verwendet werden, oder zweimal, oder Befehle, die an die Steuerung gewidmet sind, die sie verwendet, dann ist CQRS/CQS vielleicht eine Abstraktion, für die man eigentlich keine zusätzlichen Kosten bezahlen muss.
Meine Teams und ich haben festgestellt, dass dies bei einer Reihe von Projekten zutrifft. Häufig ist CQRS/CQS nur eine weitere unnötige Abstraktion wie ein Repository, das an eine ORM-Bibliothek oder einen 'Service' mit ein oder zwei Zeilenversendungen an ein Repository versendet, die ...
Hoffentlich verstehen Sie den Punkt.
Ich mag die Rule Of Three - versuchen Sie nicht, Wiederverwendbarkeit zu erhalten, bis Sie mehr als 3 Nutzungen haben. Und selbst dann, springen Sie nicht tief in etwas Schweres und sehr vorgeschrieben wie CQRS/CQS, wenn Sie es nicht brauchen. DDD ist sehr kool, aber Sie können wählen, welche Elemente für Sie sinnvoll sind. Oft wird vieles davon nicht sinnvoll sein, wenn Sie pragmatisches Denken anwenden.
Nur meine 2 c.
CQS ist ein Design-Prinzip, ** nicht ** eine Abstraktion. CQRS ist das Ergebnis der Anwendung von CQS auf ein Modell, wiederum ** nicht ** eine Abstraktion. Ein Modell (jedes Modell) ist eine Abstraktion, der Code ist die Implementierung dieser Abstraktion. Nicht zu verwechseln mit Implementierungsdetails wie Interfaces oder abstrakten Klassen. – MikeSW
@MikeSW Es ist * auch * eine Abstraktion im Kontext eines ORM. Wenn ich eine ORM-Schnittstelle habe, die es mir erlaubt, Befehle und Abfragen einfach auszugeben, und diese dann in irgendeine Art von CQS-Implementierung einbringe, dann ist es eine andere Abstraktion. Das ist alles, was ich gesagt habe.Wenn Sie kein ORM haben und beispielsweise Adonet von Grund auf neu erstellen, dann ist die Abstraktion (als Teil der Design-Principal-Implementierung) vielleicht weniger, aber immer noch da. –
Es ist nur ein Prinzip, das ORMs nicht interessiert, da ein Designprinzip sich nicht um ein Implementierungsdetail kümmern sollte. Ich denke, Sie haben verstanden, was CQS/CQRS sind. – MikeSW
Nun, so oder so scheint es sinnvoll; Das ist wahrscheinlich ein Hinweis, den Sie in einer Schnittstelle übergeben sollten, die den Vertrag ausdrückt, den der Controller erfüllt, und die Implementierungsdetails auf eine Ebene stuft.
Meine Vermutung ist, dass Sie nicht wollen, dass der Controller direkt in die Abfrage-Handler verdrahtet wird, da dies Ihre Optionen in einer Reihe von Anwendungsfällen einschränkt (Beispiel: Staukontrolle und Gegendruck). Aber du wirst es erst viel später wissen, also lass die Dinge locker.
Tut mir leid, wenn ich Ihre Absicht falsch verstehe. Die Bearbeitung von Anfragen über den Befehlsbus ist nicht wirklich die Idee hinter CQRS. Normalerweise haben Sie einen Befehlsbus zum Senden von Befehlen und separate Lesemodelle (die nach der Ausführung von Befehlen aktualisiert werden) zum Behandeln von Abfragen (die den Zustand des Systems nicht verändern). Was machen Ihre Abfrage-Handler? –