Как мы должны создавать новые агрегатные корни в архитектуре cqrs? В этом примере я хочу создать новый совокупный корневой AR2, который содержит ссылку на первый AR1.
Я создаю AR2, используя метод AR1 в качестве отправной точки. Пока что вижу несколько вариантов:
- Внутри метода в AR1
createAr2RootOpt1
я мог быnew AR2()
немедленно вызвать и сохранить этот объект в БД, используя доменную службу, которая имеет доступ к хранилищу. Я мог бы выдать событие в первом агрегатном корне, например.
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).