2010-06-23 45 views
22

单独的aggregate roots(AR)应该如何在基于DDD原则的环境中使用事件源聚合后端彼此通信?CQRS + DDD +事件采购中的汇总间通信

例如,我有一个Facility聚合根(AR),它具有负责创建Booking AR的工厂方法。 Booking是一个Person AR和Facility AR的时间敏感组合。 A Person只能预订一个Facility

在DDD中,我会参考Booking,Person,Person,Facility。但是,当生成用于事件源的事件时,我认为尝试处理来自后端的事件反序列化会变得很难。因此,我已经采取只持有参考价值基于对象的唯一ID。这带来了一个新问题,但是,当一个AR上的方法需要调用另一个AR上的另一个方法时 - 你如何处理这种情况?从域AR中打开事件源存储库?

这种情况下的一般用例是什么?我接近这一切都错了吗?

回答

37

聚合根边界定义了一致性边界。 在聚合内部,保证了一致性。 外面......它不是。 所以你不应该有横跨几个聚合的操作,并且必须保持一致。 如果您需要跨越两个总计的交易,您应该查看您的总计边界。

对于在聚合之外发生的事情,您应该有一个事件处理程序,它将向其他聚合发送命令。 如果聚合之间的操作逻辑更加复杂,那么可以定义一个进程,一个状态机,它将侦听事件并将命令发送给聚合。 流程可以用来定义长时间运行的事务(带有补偿而不是回滚),或者基于系统中大规模(甚至在有界的上下文之间)发生的事情来做出商业决策。

+2

好的答案 - 如果您碰巧在这个主题上寻找更深入的内容,您可能会发现这篇文章有帮助:[事件源系统中的汇总间通信](http://danielwhittaker.me/2014/11/22/ 4-秘密 - 互间聚集的通信事件来源的系统/) – Codescribler 2016-01-31 19:55:16

4

当使用Event Sourcing和CQRS时,AR间通信最优雅(至少在我看来)是消息传递。你可以看看Ncqrs项目(如果你是一个.NET家伙,这会更容易),特别是'消息'分支。这个想法是,AR为他们处理的每个消息类型实现IMessageHandler接口,而AR基类公开Send方法发送消息。借助于此API,客户端可以调用模型行为,而模型本身可以进行通信(在AR之间)。