Ich möchte meine erste Anwendung mithilfe des CQRS-Musters zusammen mit Event Sourcing implementieren. Ich frage mich, wie die Erstellung aggregierter Wurzeln richtig gehandhabt werden sollte. Angenommen, jemand sendet den Befehl CreateItem. Wie soll damit umgegangen werden? Wo soll das Ereignis ItemCreated gespeichert werden? Als erstes Ereignis eines neuen Artikels? Oder sollte ich eine Art ItemList-Entität haben, die alle Elemente aggregiert und deren Ereignisliste nur aus ItemCreated-Ereignissen besteht?
Udi Dahan schlägt vor, keine aggregierten Wurzeln zu erstellen und stattdessen immer eine Art Abrufmethode zu verwenden. Aber wie kann ich etwas abrufen, das neu ist und dem sicherlich keine ID zugewiesen wurde? Ich verstehe die Idee dahinter und es ist ziemlich vernünftig zu glauben, dass ein neues Objekt ein Objekt ist, dessen Status aus null Ereignissen besteht, auf die geantwortet wurde. Aber wie soll ich es benutzen? Sollte ich eine bestimmte Methode in meinem Repository haben getNewItem()
oder meine get(id)
Methode Optional<ItemId>
stattdessen akzeptieren lassen ?
Bearbeiten: Nach einiger Zeit des Grabens fand ich eine wirklich interessante Implementierung der oben genannten Muster unter Verwendung von Schauspielern. Anstatt das Aggregat zu erstellen, ruft der Autor es aus einem Repository mit neu erstellter UUID ab. Der Nachteil dieses Ansatzes besteht darin, dass er einen vorübergehenden Inkonsistenzzustand zulässt. Ich frage mich auch, wie ich delete
mit einem solchen Ansatz eine Methode implementieren kann . Einfach Gelöschtes Ereignis zur Ereignisliste des Aggregats hinzufügen?