Come dovremmo creare nuove radici aggregate nell'architettura cqrs? In questo esempio voglio creare una nuova radice aggregata AR2 che contenga il riferimento al primo AR1.
Sto creando AR2 usando il metodo AR1 come punto di partenza. Finora vedo poche opzioni:
- Metodo interno in AR1
createAr2RootOpt1
Potrei chiamarenew AR2()
e salvare questo oggetto in db imediatelly utilizzando il servizio di dominio che ha accesso al repository. -
Potrei emettere un evento nella prima radice aggregata es.
SholdCreateAR2Event
e poi avere saga senza stato che reagisce su questo ed emette il comandoCreateAR2Command
che viene poi gestito e in realtà crea AR2 ed emetteAR2CreatedEvent
. In caso di utilizzo dell'output di eventiSholdCreateAR2Event
non verrebbe mantenuto nell'archivio eventi, poiché non influisce sullo stato della prima radice aggregata. (O dovremmo ancora salvarlo nell'archivio degli 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()); } }
Quale è il modo più corretto per farlo?