CQRS和域事件

时间:2010-10-01 19:19:34

标签: cqrs domain-events

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

1 个答案:

答案 0 :(得分:10)

a)您不应该在提交事务之前发布事件,事件代表发生的事情,因此它们都是以传递时态命名的原因(例如OrderClearedEvent)。此外,如果您必须“还原”某个事件,您应该采取纠正措施,即您不要删除该事件,您必须触发一个新事件来纠正您想要还原的事件的影响

b)看起来这对你如何为实体建模和命令更具有问题。我不能想到OrderDetail会成为AggregateRoot的原因,但我不知道你的域名......

c)命令将导致至少发布一个事件

希望这会有所帮助:)正如Rinat所说,google小组是提问的最佳地点,也可以查看cqrsinfo.com以及github.com/MarkNijhof/Fohjin和github.com/gregoryyoung/的示例代码先生