cqrs 아키텍처에서 어떻게 새로운 집계 루트를 만들어야합니까? 이 예에서는 첫 번째 AR1에 대한 참조를 보유하는 새로운 집계 루트 AR2를 작성하려고합니다.
AR1 방법을 시작점으로 사용하여 AR2를 만들고 있습니다. 지금까지 몇 가지 옵션이 있습니다.
- AR1의 내부 메소드는 리포지토리에 액세스하는 도메인 서비스를 사용 하여이 객체를
createAr2RootOpt1호출new AR2()하여 dbmedia에 ly 저장할 수 있습니다. 예를 들어 첫 집계 루트에서 이벤트를 생성 할 수 있습니다.
SholdCreateAR2Event그리고 이것에 반응하고 명령CreateAR2Command을 내린 상태 비 저장 사가 (stateless saga)를 가지고 있고 실제로 처리되고 실제로 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 내부의 아무것도 수정하지 않음).