在 CQRS 中维护聚合根引用。 Sagas 与命令处理程序
Maintaining Aggregate Root references in CQRS. Sagas vs command handlers
我正在构建一个原型来探索 CQRS 和事件溯源。
假设我有 2 个根聚合,Organisation 和 Position,一对多关系需要双向引用。职位可以没有组织(例如自由职业者)。
对于此讨论,我们假设已创建了 Organization 和 Position 对象。我现在有一个 AddPositionToOrganisation
命令。
确保引用同步 我知道我有两个选择。
- 组织命令处理程序可以生成两个事件。一份用于组织,一份用于添加相应的参考文献。
- 创建一个监听
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 架构模式构建应用程序的有用参考。
我正在构建一个原型来探索 CQRS 和事件溯源。
假设我有 2 个根聚合,Organisation 和 Position,一对多关系需要双向引用。职位可以没有组织(例如自由职业者)。
对于此讨论,我们假设已创建了 Organization 和 Position 对象。我现在有一个 AddPositionToOrganisation
命令。
确保引用同步 我知道我有两个选择。
- 组织命令处理程序可以生成两个事件。一份用于组织,一份用于添加相应的参考文献。
- 创建一个监听
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 架构模式构建应用程序的有用参考。