Come dovremmo creare nuove radici aggregate nell'architettura cqrs? In questo esempio, voglio creare un nuovo AR2 radice aggregato che contenga il riferimento al primo AR1.
Sto creando AR2 usando il metodo AR1 come punto di partenza. Finora vedo alcune opzioni:
- All'interno del metodo in AR1
createAr2RootOpt1
ho potuto chiamarenew AR2()
e salvare questo oggetto su db immediatamente usando il servizio di dominio che ha accesso al repository. Potrei emettere un evento nella prima radice aggregata, ad es.
SholdCreateAR2Event
e quindi avere una saga senza stato che reagisce su questo e emette un comandoCreateAR2Command
che viene quindi gestito e in realtà crea AR2 ed emetteAR2CreatedEvent
. Nel caso in cui si utilizzi il sourcing degli eventiSholdCreateAR2Event
non verrebbe conservato nell'archivio eventi, poiché non influisce sullo stato della prima radice aggregata. (O dovremmo ancora salvarlo nell'archivio eventi?)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()); } }
Qual è il modo più corretto per farlo?
AR1WasCreated
? Dovrebbe essereAR2WasCreated
? Inoltre, se uso la tua logica, emetto un eventoAR2WasCreated
prima che venga effettivamente creato? E salvare questo evento nel registro eventi di AR1 sembra problematico, dal momento che in realtà non ho bisogno di questi dati all'interno di AR1 (non modifica nulla all'interno di AR1).