¿Cómo debemos crear nuevas raíces agregadas en la arquitectura cqrs? En este ejemplo, quiero crear una nueva raíz agregada AR2 que tenga referencia a la primera AR1.
Estoy creando AR2 usando el método AR1 como punto de partida. Hasta ahora veo pocas opciones:
- Dentro método en AR1
createAr2RootOpt1
que podría llamarnew AR2()
y guardar este objeto db imediatelly utilizando el servicio de dominio que tenga acceso al repositorio. Podría emitir evento en la primera raíz agregada, por ejemplo.
SholdCreateAR2Event
y luego tienen una saga sin estado que reacciona ante esto y emite un comandoCreateAR2Command
que luego se maneja y realmente crea AR2 y emiteAR2CreatedEvent
. En caso de utilizar el abastecimiento de eventosSholdCreateAR2Event
, no se conservaría en el almacén de eventos, ya que no afecta el estado de la primera raíz agregada. (¿O deberíamos guardar esto en la tienda de eventos?)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()); } }
¿Cuál es la forma más adecuada de hacer esto?
AR1WasCreated
? Debe serAR2WasCreated
? Además, si uso su lógica, ¿emito un eventoAR2WasCreated
antes de que se cree realmente? Y guardar este evento dentro del registro de eventos de AR1 parece problemático, ya que en realidad no necesito estos datos dentro de AR1 (no modifica nada dentro de AR1).