我们应该如何在cqrs体系结构中创建新的聚合根?在此示例中,我想创建新的聚合根AR2,其中包含对第一个AR1的引用。
我正在使用AR1方法作为起点来创建AR2。到目前为止,我看到的选择很少:
- 在AR1的内部方法中,
createAr2RootOpt1
我可以new AR2()
使用具有访问存储库权限的域服务立即将该对象调用并将其保存到db。 我可以在第一个聚合根发出事件,例如。
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内的任何内容)。