CQRS和域事件

The*_*Mar 13 cqrs domain-events

CQRS让我进入思维模式.我正在尝试用CQRS创意开始一个新项目.我喜欢的主要内容是
1)Query和Command的分离.我们的域查询一直是个问题.
2)使用事件存储进行审计 - 我不会将其用于重播 - 至少现在不是.

我很擅长查询方面,我仍然对域事件有一些疑问

如果一个命令导致多个聚合根(例如订单和订单详细信息)的更新,我将把它们限定在UnitofWork(事务性)下.现在,每个域负责在更改发生到其状态时发布事件.

让我们说该命令更改3 orderDetail记录.每个OrderDetail将发布2个事件.最后我们有6个活动.

a)如果我在对域对象进行更改(但未提交事务)后立即发布事件,如何撤消已发布的事件(并且可能已被订阅者使用)

  • 我能想到的是将事件保存在"同一工作单元范围内"的列表中,并且一旦调用了事务提交,就将其存储并发布.这听起来像是人们会做的事吗.

b)如果OrderDetail中的更改要求在Order Aggregate Root中进行某些更改,那么
i)我应该通过处理OrderDetail Aggregate发布的事件来进行这些更改吗?对于前者 让我们说两个订单明细被删除.这使订单状态从"首选"变为"不首选".ii)如果事件错误并且没有更新订单状态怎么办 - 如果订单仍然是首选,那么它将在2天内发货.

添加另一个问题
c)"域事件是所有应用程序状态更改的来源"还是"所有应用程序状态更改的结果"

先感谢您,

三月

rou*_*sis 10

a)在提交事务之前,不应发布事件,事件代理已发生事件,因此它们都以传递时序命名(例如OrderClearedEvent).此外,如果您必须"恢复"某个事件,您应该采取纠正措施,即您不要删除该事件,您必须触发一个新事件来纠正您要还原的事件的影响

b)对于你如何为实体建模并命令其他任何东西,这似乎更成问题.我不能想到OrderDetail会成为AggregateRoot的原因,但我不知道你的域名......

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

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