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 ...
domain-driven-design
cqrs
event-sourcing
Ludovic C
quelle
quelle
Antworten:
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
und Befehle
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.
quelle
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
quelle
UserWasAddedToCrm
? Den gesamten Stream umschreiben?Ein Befehl kann mehrere Ereignisse auslösen. Es ist einfach eine logische Schlussfolgerung aus einer Tatsache:
Composite command
existiert.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.
quelle