Як нам створити нові сукупні корені в архітектурі cqrs? У цьому прикладі я хочу створити новий сукупний корінь AR2, який має посилання на перший AR1.
Я створюю AR2, використовуючи метод AR1 як вихідну точку. Поки що я бачу кілька варіантів:
- Метод всередині AR1
createAr2RootOpt1
я міг викликатиnew AR2()
та зберегти цей об'єкт до db imediatelly, використовуючи доменний сервіс, який має доступ до сховища. Я міг би випустити подію в першому сукупному корені, наприклад.
SholdCreateAR2Event
а потім мати сагу без громадянства, яка реагує на це і видає команду,CreateAR2Command
яка потім обробляється і фактично створює AR2 і випускаєAR2CreatedEvent
. У разі використання джерела подіїSholdCreateAR2Event
не зберігатимуться в магазині подій, оскільки це не впливає на стан першого кореневого кореня. (Або ми все-таки повинні зберігати це в магазині подій?)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()); } }
Який правильніший спосіб зробити це?
AR1WasCreated
? Чи має бутиAR2WasCreated
? Крім того, якщо я використовую вашу логіку, я випускаю подію щеAR2WasCreated
до того, як вона фактично створена? І збереження цієї події всередині журналу подій AR1 видається проблематичним, оскільки я фактично не потребую цих даних у AR1 (він нічого не змінює в AR1).