CQRS让我进入思维模式..我正在尝试用CQRS创意开始一个新项目。我喜欢的主要事情是 1)Query和Command的分离。我们的域查询一直是个问题 2)使用事件存储进行审计 - 我不会将其用于重播 - 至少现在不是。
我对查询方面很满意,但我仍然对域事件有一些疑问
如果一个Command导致多个聚合根(例如Order和OrderDetail)的更新,我将把它们限定在UnitofWork(事务性)下。现在,每个域都负责在更改发生到其状态时发布事件。
让我们说命令更改3 orderDetail记录。每个OrderDetail将发布2个事件。最后我们有6个活动。
a)如果我在对域对象进行更改(但未提交事务)后立即发布事件,如何撤消已发布的事件(并且可能已被订阅者使用)
b)如果OrderDetail中的更改要求在Order Aggregate Root中进行某些更改,那么 i)我应该通过处理OrderDetail Aggregate发布的事件来进行这些更改吗?对于前者让我们说两个订单明细被删除。这使订单状态从“首选”变为“不首选”。 ii)如果事件错误并且没有更新订单状态怎么办 - 如果订单仍然是首选,那么它将在2天内发货。
添加其他问题
c)“域事件是所有应用程序状态更改的来源”还是“所有应用程序状态更改的结果”
先谢谢你,
The Mar
答案 0 :(得分:10)
a)您不应该在提交事务之前发布事件,事件代表发生的事情,因此它们都是以传递时态命名的原因(例如OrderClearedEvent)。此外,如果您必须“还原”某个事件,您应该采取纠正措施,即您不要删除该事件,您必须触发一个新事件来纠正您想要还原的事件的影响
b)看起来这对你如何为实体建模和命令更具有问题。我不能想到OrderDetail会成为AggregateRoot的原因,但我不知道你的域名......
c)命令将导致至少发布一个事件
希望这会有所帮助:)正如Rinat所说,google小组是提问的最佳地点,也可以查看cqrsinfo.com以及github.com/MarkNijhof/Fohjin和github.com/gregoryyoung/的示例代码先生