Frage

Wir versuchen, aus CQRS . Wir haben eine Validierung Situation, in der ein Customerservice (Domain Service) muss wissen, ob ein Kunde existiert. Kunden sind einzigartig durch ihre E-Mail-Adresse. Unser Customer Repository (eine generische Repository) nur hat Get (id) und hinzufügen (Kunde). Wie sollte der Customer herauszufinden, ob der Kunde existiert?

War es hilfreich?

Lösung

Werfen Sie einen Blick auf diesen Blog-Eintrag: Set basierte Validierung in der CQRS Architektur .

Es befasst sich mit diesem Thema sehr. Es ist ein komplexes Thema beschäftigen in CQRS. Was Bjarte ist darauf hindeutet, ist die Berichtsdatenbank für bestehende Kunden-E-Mail-Adressen abzufragen und einen kompensierenden Befehl (wie CustomerEmailAddressIsNotUniqueCompensatingCommand) zurück zum Domain Model aus, wenn eine E-Mail-Adresse gefunden wurde. Sie können dann entsprechende Ereignisse abfeuern, die eine UndoCustomerCreationEvent umfassen kann.

Lesen Sie die Kommentare auf der oben genannten Blog-Post für alternative Ideen.

Adam D. in einem Kommentar darauf hin, dass die Validierung einer Domain Anliegen ist. Als Ergebnis können Sie ReservedEmailAddresses in einem Dienst speichern, die Kunden Erstellung und wird mit Feuchtigkeit versorgt durch die Ereignisse in Ihrem Ereignisspeicher ermöglicht.

Ich bin nicht sicher, gibt es eine einfache Lösung für dieses Problem, das ganz sauber anfühlt. Lassen Sie mich wissen, was Sie kommen mit!

Viel Glück!

Andere Tipps

Diese Fragen haben nicht so komplex sein:

  1. Überprüfen Sie die Berichts Speicher für Kunden Einzigartigkeit vor dem Updatecustomer Befehl eingeben.
  2. eine Einschränkung auf Ihre DB für Einzigartigkeit auf E-Mail-Adresse hinzufügen. Wenn der Befehl ausgeführt wird, übernimmt die Ausnahme, und eine Benachrichtigung an den Benutzer sendet eine Antwortkanal. (Hences nie CustomerUpdated Ereignisse Berichts speichern Brennen.

Mit der Datenbank für das, was es ist gut und bekomme auf ORM Einschränkungen nicht aufgehängt.

Dieser Beitrag von Udi Dahan http://www.udidahan.com/ 2009/12 / 09 / geklärte-cqrs / enthält den folgenden Absatz:

„Auch wir sollten nicht den Abfragespeicher zugreifen müssen Befehle verarbeiten - jeder Staat, der benötigt wird, sollte von der autonomen Komponente verwaltet werden. - das ist Teil der Bedeutung der Autonomie“

Ich glaube Udi schlug einfach eine eindeutige Einschränkung auf die Datenbank hinzugefügt wird.

Aber wenn Sie wie zu tun, dass nicht das Gefühl, auf der Grundlage der obigen Aussage, ich würde nur vorschlagen, Hinzufügen des „ByEmail“ -Methode in das Repository und mit ihm getan werden - aber dann wieder Udi würde wahrscheinlich einen besseren Vorschlag hat. .

Hoffe, ich bin nicht zu spät ... aber wir standen vor einer ähnlichen Situation in unserem Projekt, wir tatsächlich abfangen dem Anweisungsausführer und befestigen Sie es mit dem Satz von Regeln für diesen Befehl erstellt, die wiederum eine Abfrage verwendet das holen Daten.

So in diesem Fall können wir eine Klasse mit dem Namen, CustomerEmailMustBeUniqueRule, die von der RuleEngine geholt wird, wenn der Befehl „RegisterCustomerCommand“ etwa ist durch RegisterCustomerCommandExecutor ausgeführt werden. Diese Regel Klasse hat die Verantwortung für die Datenbank abzufragen, ob die E-Mail-ID existieren zu finden und die Ausführung stoppen, indem die ungültige Flagge Anhebung ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top