26

在基于 DDD 原则构建的环境中,使用事件源聚合后端,单独的聚合根(AR) 应如何相互通信?

例如,我有一个Facility聚合根 (AR),它有一个负责创建BookingAR 的工厂方法。这BookingPersonAR 和FacilityAR 的时间敏感组合。APerson只能单人预订Facility

在 DDD 中,我会持有对BookinginPersonPersonin的引用Facility。但是,在生成用于事件溯源的事件时,我认为尝试从后端处理事件反序列化会变得令人望而却步。因此,我只保留对基于值对象的唯一 ID 的引用。然而,这带来了一个新问题,当 AR 上的一个方法需要调用另一个 AR 上的另一个方法时——你如何处理这种情况?从域 AR 中访问事件源存储库?

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

4

2 回答 2

46

聚合根边界定义了一致性边界。在聚合内部,一致性得到保证。外面……不是。所以你不应该有跨越多个聚合的操作并且必须是一致的。如果您需要一个跨越两个聚合的事务,您应该检查您的聚合边界。

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

于 2010-11-03T09:12:34.103 回答
4

当使用事件溯源和 CQRS 时,最优雅的(至少在我看来)AR 间通信的方式是消息传递。您可以查看Ncqrs项目(如果您是 .NET 人员,这会更容易),尤其是“消息传递”分支。这个想法是,AR 为它们处理的每种消息类型实现 IMessageHandler 接口,并且 AR 基类公开方法 Send 用于发送消息。通过这个 API,客户端可以调用模型行为,模型本身可以通信(在 AR 之间)。

于 2010-07-01T22:37:03.683 回答