在 CQRS 中维护聚合根引用。 Sagas 与命令处理程序

Maintaining Aggregate Root references in CQRS. Sagas vs command handlers

我正在构建一个原型来探索 CQRS 和事件溯源。

假设我有 2 个根聚合,OrganisationPosition,一对多关系需要双向引用。职位可以没有组织(例如自由职业者)。

对于此讨论,我们假设已创建了 Organization 和 Position 对象。我现在有一个 AddPositionToOrganisation 命令。

确保引用同步 我知道我有两个选择。

  1. 组织命令处理程序可以生成两个事件。一份用于组织,一份用于添加相应的参考文献。
  2. 创建一个监听 PositionAddedOrganisation 事件的 Saga 并创建一个 AddOrganisationToPositionCommand.

使用组织命令处理程序为职位生成事件是否有问题?从好的方面来说,它将相关功能组合在一起(引用),但让组织负责一些职位逻辑。

非常欢迎更有经验的开发人员提供一些见解。

一个aggregate定义了一个一致性边界;每个事务都限定在一个聚合范围内。尝试一次修改多个聚合(例如在命令处理程序中)违背了这一建议。

A process manager (saga) 非常适合这个用例。它是一个独立的组件,以交叉聚合、最终一致的方式对域事件做出反应。在最简单的形式中,流程管理器对域事件做出反应并分派命令作为响应。它还可以跟踪与流程相关的状态,以帮助关联聚合之间的事件。

因此,我建议您采用第二种方法。

为了进一步阅读流程管理器,我推荐 CQRS Journey guide written by Microsoft's Patterns & Practices team. The Implementing Domain-Driven Design Vaughn Vernon 的书,它是按照 CQRS 架构模式构建应用程序的有用参考。