Como devemos criar novas raízes agregadas na arquitetura cqrs? Neste exemplo, eu quero criar um novo AR2 raiz agregado que contém referência ao primeiro AR1.
Estou criando o AR2 usando o método AR1 como ponto de partida. Até agora, vejo algumas opções:
- Método interno no AR1
createAr2RootOpt1
eu poderia chamarnew AR2()
e salvar este objeto no db imediatamente usando o serviço de domínio que tem acesso ao repositório. Eu poderia emitir evento na primeira raiz agregada, por exemplo.
SholdCreateAR2Event
e depois temos uma saga sem estado que reage a isso e emite um comandoCreateAR2Command
que é então tratado e realmente cria AR2 e emiteAR2CreatedEvent
. No caso de usar a fonte de eventosSholdCreateAR2Event
, não seria preservado no armazenamento de eventos, pois não afeta o estado da primeira raiz agregada. (Ou ainda devemos salvar isso na loja 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()); } }
Qual é a maneira mais adequada de fazer isso?
AR1WasCreated
? Deveria serAR2WasCreated
? Além disso, se eu usar sua lógica, emito um eventoAR2WasCreated
antes que ele seja realmente criado? E salvar esse evento dentro do log de eventos do AR1 parece problemático, pois eu realmente não preciso desses dados dentro do AR1 (ele não modifica nada dentro do AR1).