Wie sollen wir neue aggregierte Wurzeln in der cqrs-Architektur erstellen? In diesem Beispiel möchte ich ein neues aggregiertes Stamm-AR2 erstellen, das auf das erste AR1 verweist.
Ich erstelle AR2 mit der AR1-Methode als Ausgangspunkt. Bisher sehe ich nur wenige Möglichkeiten:
- Innerhalb der Methode in AR1
createAr2RootOpt1
konnte ichnew AR2()
dieses Objekt sofort mithilfe eines Domänendienstes mit Zugriff auf das Repository aufrufen und in der Datenbank speichern. Ich könnte ein Ereignis in der ersten aggregierten Wurzel ausgeben, z.
SholdCreateAR2Event
und dann eine zustandslose Saga haben, die darauf reagiert und einen Befehl ausgibt,CreateAR2Command
der dann verarbeitet wird und tatsächlich AR2 erstellt und ausgibtAR2CreatedEvent
. Bei Verwendung der Ereignisbeschaffung wirdSholdCreateAR2Event
diese nicht im Ereignisspeicher beibehalten, da sie den Status des ersten aggregierten Stamms nicht beeinflusst. (Oder sollten wir dies trotzdem im Event Store speichern?)class AR1{ Integer id; DomainService ds; //OPTION 1 void createAr2RootOpt1(){ AR2 ar2 = new AR2(); ds.saveToRepo(ar2); } //OPTION 2 void createAr2RootOpt2(){ publishEvent(new SholdCreateAR2Event()); //we don't need this event. Shoud it still be preserved in event store? } } class AR2{ Integer id; Integer ar1Id; void handle(CreateAR2Command command){ //init this AR with values and save publishEvent(AR2CreatedEvent()); //used for projections afterwards and saved inside AR2 event store } } class Saga{ void handle(SholdCreateAR2Event ev){ emitCommand(new CreateAR2Command()); } }
Was ist der richtige Weg, dies zu tun?
AR1WasCreated
? Sollte es seinAR2WasCreated
? Wenn ich Ihre Logik verwende, gebe ich ein Ereignis aus,AR2WasCreated
bevor es tatsächlich erstellt wird. Das Speichern dieses Ereignisses im Ereignisprotokoll von AR1 scheint problematisch zu sein, da ich diese Daten in AR1 nicht benötige (es ändert nichts in AR1).