Sollte bei Verwendung von DDD und CRQS genau ein Ereignis pro Befehl angegeben werden?

15

Ich suche nach einer Möglichkeit, eine Ddd-Anwendung mit Konvention über Konfiguration zu entwerfen.

Angenommen, für ein Aggregat "Client" ist der Befehl "FillProfile" definiert. Es wird logischerweise ein Ereignis "ProfileFilled" auslösen.

Gibt es Fälle, in denen ein Befehl mehr als ein Ereignis auslöst, oder in denen ein Befehl basierend auf einer bestimmten Logik verschiedene Ereignisse auslöst? Oder ist dies immer eine 1 - 1 - Beziehung (1 Befehl löst immer keine oder ein einzelnes Ereignis eines bestimmten Typs aus).

Ich frage dies, weil ich, wenn dies eine Tatsache ist, dass ein Befehl immer das gleiche Ereignis auslöst, mein Konventionssystem auf dieser Tatsache aufbauen kann. Ich weiß, dass "RaiseEvent" zu "EventRaised" führt ...

Ludovic C
quelle
1
Wenn der Befehl zwei Dinge verursacht, können Sie davon ausgehen, dass jedes Ereignis ausgelöst wird. ProfileGenerated, ProfileSaved, Auch jedes Ereignis kann einen Fehler verursachen, der erneut ein Ereignis auslösen kann
Ewan
Außerdem können Systeme trivialerweise BeforeCommand-, AfterCommand-Ereignisse usw. implementieren
Ewan,
Oder der Befehl kann eine Schleife ausführen, z. B. FillProfiles () profileFilled, profileFilled ....
Ewan
@Ewan, will dich nur korrigieren. Ein Domain-Event kann keinen Fehler erzeugen. Nur Befehle können. Domänenereignisse bedeuten, dass etwas passiert ist , während Befehle bedeuten, dass die Absicht besteht , etwas geschehen zu lassen, das abgelehnt oder akzeptiert werden kann. Mit anderen Worten, ein Fehler muss ausgelöst werden, bevor ein Domänenereignis ausgelöst wird (es sei denn, dieses Domänenereignis steht natürlich im Zusammenhang mit der Fehlerprotokollierung).
Ludovic C

Antworten:

18

Da Sie Ihre Frage mit "CQRS" markiert haben, meine ich Ereignisse in einem "CQRS & Event Sourcing" -Kontext, wie er hier beschrieben wird . In diesem Tutorial wird der Unterschied zwischen Ereignissen und Befehlen gut erklärt:

  • Ereignisse erfassen die elementaren "Dinge, die in Ihrem System passieren können", aus der Sicht des Systems.

  • Befehle werden durch das definiert, was der Benutzer aus seiner Sicht als Operation ansieht

Und obwohl dies häufig zu einigen Befehlen und Ereignissen mit einer 1: 1-Übereinstimmung führt, können diese unterschiedlichen Sichtweisen zu Befehlen führen, die mehr als ein Ereignis auslösen, oder zu unterschiedlichen Ereignissen, abhängig von den Befehlsparametern. Ich kann mir sogar Fälle vorstellen, in denen ein Befehl überhaupt kein Ereignis auslöst, aber das wäre ein sehr außergewöhnlicher Fall, kein sehr typischer.

Im Tutorial werden beispielsweise Ereignisse erwähnt

  • TabOpened
  • GetränkeBestellt
  • FoodOrdered

und Befehle

  • OpenTab
  • Bestellung aufgeben

Hier führt der Befehl "OpenTab" zu einem Ereignis "TabOpened", aber der Befehl PlaceOrder führt zu den Ereignissen "DrinksOrdered", "FoodOrdered" oder beiden.

Wenn Sie ein neues System "von Grund auf neu" entwerfen, können Sie versuchen, es mit einer 1: 1-Entsprechung zwischen Befehlen und Ereignissen zu entwerfen und zu überprüfen, wie gut das skaliert, wenn das System größer wird. Sie können sogar einen hybriden Ansatz ausprobieren: eine Liste von Ereignissen und Befehlen mit einer 1: 1-Entsprechung zusammen mit einigen zusätzlichen kombinierten Befehlen. Probieren Sie einfach aus, wie weit Sie zu dem jeweiligen System führen, das Sie entwerfen.

Doc Brown
quelle
9

Normalerweise führt ein Befehl zu einem Ereignis. In einigen Fällen kann es sich jedoch auch um mehrere handeln. Dies hängt von Ihrer Implementierung ab.

Entweder ruft Ihr Befehl andere Befehle auf und jeder von ihnen löst eigene Ereignisse aus. Oder Ihr Befehl führt verschiedene Aufgaben aus und gibt mehrere Ereignisse aus. Beispielsweise:

RegisterUserCommand

  • User.create (E-Mail, Passwort) → UserCreatedEvent
  • User.updateProfile (Vorname, Nachname, Ort) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent
synthomat
quelle
Was passiert, wenn Sie sich später dafür entscheiden UserWasAddedToCrm? Den gesamten Stream umschreiben?
Mcintyre321
9

Ein Befehl kann mehrere Ereignisse auslösen. Es ist einfach eine logische Schlussfolgerung aus einer Tatsache: Composite commandexistiert.

Nehmen wir an, Sie haben zwei Befehle, die jeweils ein Ereignis auslösen. Anschließend erstellen Sie einen zusammengesetzten Befehl aus diesen beiden Befehlen. Aus der Sicht eines Benutzers, der den zusammengesetzten Befehl verwendet, sieht es so aus, als hätte der Befehl zwei Ereignisse ausgelöst.

Es hindert Sie also nichts daran, mit einem einzigen Befehl mehrere (oder gar keine) Ereignisse auszulösen.

Euphorisch
quelle