1

我正在使用 DDD 设计一个 CQRS 应用程序,并且想知道如何实现以下场景:

  • 一个Participant聚合可以被多个ParticipantEntry聚合引用
  • anAddParticipantInfoCommand发给 Command 端,其中包含Participantand one的所有信息ParticipantEntry(类似于 an Orderand one OrderLineItem

应该在哪里实现检查参与者是否已经存在以及如果不存在则创建参与者的逻辑?

  • Participant是否应该在 Saga 中完成,首先检查域AddParticipantCommand模型AddParticipantEntry是否Participant ID存在
  • 这应该完全由域模型本身的聚合根来完成吗?
4

2 回答 2

5

您不一定需要 sagas 来处理这种情况。请查看我的博客文章,了解为什么创建聚合根,以及该怎么做:

http://udidahan.com/2009/06/29/dont-create-aggregate-roots/

于 2017-09-10T06:13:00.753 回答
1

应该在哪里实现检查参与者是否已经存在以及如果不存在则创建参与者的逻辑?

在大多数情况下,此行为应受参与者聚合本身的控制。

当您需要跨多个事务边界协调更改时,流程很有用。但是,可以在同一事务中管理对同一聚合的两次更改。

可以将其实现为在同一聚合上运行的两个不同事务,并进行协调;但是过程的额外复杂性并没有带来任何好处。将单个命令发送到聚合要简单得多,并允许它决定要采取哪些操作来维护正确的不变量。

特别是 Sagas 是一种用于还原多个事务的模式。Yan Cui 的How the Saga Pattern 如何使用 AWS Lambda 和 Step Functions 管理故障,其中很好地说明了旅行预订传奇。

(注意:关于“saga”的定义存在相当大的混淆;NServiceBus 社区倾向于以与Garia-Molina 和 Salem最初描述的方式略有不同的方式来理解这个术语。kellabyte 的Clarifying the Saga Pattern调查了这种混淆。)

于 2017-09-06T12:14:03.333 回答