2015-07-10 4 views
17

Ich begann mit dem Lesen über CQRS und ich bin etwas verwirrt.CQRS - darf die Leseseite von der Schreibseite aufgerufen werden?

Kann die Leseseite innerhalb der Schreibseite aufgerufen werden, um zusätzliche Informationen zu erhalten?

http://cqrs.nu/Faq/command-handlers hier sagen sie, es ist nicht erlaubt, aber in der cqrs Reise-Code habe ich festgestellt, dass sie einen Service 'IPricingService' aufrufen, die intern eine DAO-Service-Klasse verwendet.

Also was muss ich tun, um zusätzliche Informationen innerhalb meiner Aggregation root zu bekommen?

Antwort

19

CQRS Journey sollte nicht als Handbuch angesehen werden. Dies ist nur eine Geschichte von einigen Teams, die sich ihren Weg zu CQRS erkämpfen und alle Einschränkungen haben, nur Microsoft Stack zu verwenden. An sich sollten Sie Ihr Lesemodell nicht in den Befehls-Handlern oder der Domänenlogik verwenden. Sie können jedoch Ihr Lesemodell vom Client abfragen, um die für Ihren Befehl benötigten Daten abzurufen und den Befehl zu validieren.

Da ich einige downvotes über diese Antwort habe, muss ich darauf hinweisen, dass das, was ich geschrieben habe, die etablierte Praxis innerhalb des Musters ist. Keine Lese-Seite greift auf die Schreib-Seite zu, keine Schreib-Seite erhält Daten von der Lese-Seite.

Die Definition von "Client" könnte jedoch ein Thema der Diskussion sein. Ich würde beispielsweise einer öffentlich zugänglichen JS-Browseranwendung nicht vertrauen, dass sie ein richtiger "Client" ist. Stattdessen würde ich meinen REST-API-Layer als "Client" in CQRS verwenden und die Webanwendung wäre nur ein UI-Layer für diesen Client. In diesem Fall ist die Verarbeitung des REST-API-Dienstaufrufs ein legitimer Leseseitenleser, da alle Benutzer überprüft werden müssen, welche UI-Schicht gesendet wird, um Fälschungen zu verhindern und einige Geschäftsregeln zu validieren. Wenn diese Arbeit abgeschlossen ist, wird der Befehl gebildet und zur Schreibseite gesendet. Die Validierungen und alles andere ist synchron und die Befehlsverarbeitung ist dann asynchron.

AKTUALISIERUNG: Angesichts einiger Meinungsverschiedenheiten möchte ich auf Udi's article from 2009 hinweisen, die über CQRS im Allgemeinen, Befehle und Validierung im Besonderen sprechen.

+2

Ich stimme nicht zu. Wenn Ihre Befehle die Daten enthalten müssen, die der Handler benötigt, um Ihren Befehl zu validieren, können Sie die Validierungslogik in Ihrem Handler/Ihrer Domäne niemals ändern, ohne den * client * ebenfalls zu beeinträchtigen. Dies setzt dem Client eindeutig zu viel von der Befehlsvalidierung/Domänenkenntnis aus und widerspricht dem, dass der Client nur eine Absicht ausdrücken möchte. IMHO eine bessere Lösung ist es, eine "PricingService" -Schnittstelle (die Teil der allgegenwärtigen Sprache sind) zu Ihren Aggregat-Wurzeln bereitzustellen und dann die Schnittstelle nach Bedarf zu implementieren - was die Abfrage der Leseseite beinhalten könnte. –

+0

Ich muss das hier hinterfragen. – JoG

+2

@AlexanderLanger Das habe ich nicht erfunden, so ist das Muster entworfen. Möglicherweise können Sie die Leseseite von Ihrem Befehls-Handler abfragen, aber dies ist etwas anderes als das fragliche Muster. Wenn Sie ein Diagramm auf CQRS betrachten, werden Sie nie sehen, dass das Lesemodell vom Schreibmodus abgefragt wird. Es wird nur vom Client gelesen. –

2

Die CQRS FAQ (http://cqrs.nu/Faq) schlägt vor:

„Wie kann ich zwischen begrenzten Kontexten kommunizieren

ausschließlich im Hinblick auf ihre öffentliche API Diese von einem anderen beschränkten Kontext oder kommen abonnieren Ereignisse in sich bergen könnte?.. Ein beschränkter Kontext könnte sich wie ein normaler Client eines anderen verhalten und Befehle und Abfragen senden. "

Also obwohl innerhalb eines BC es nicht möglich ist, Lese-Seite von der Schreibseite und umgekehrt zu verwenden, könnte ein anderer beschränkter Kontext oder Dienst. Im Wesentlichen würde dies wie ein Mensch handeln, der die Benutzerschnittstelle verwendet.

Verwandte Themen