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 내부의 아무것도 수정하지 않음).