我正在使用DDD设计CQRS应用程序,并且想知道如何实现以下场景:
Participant
聚合ParticipantEntry
聚合
AddParticipantInfoCommand
,其中包含Participant
和一个ParticipantEntry
的所有信息(类似于Order
和一个OrderLineItem
)在哪里实施逻辑以检查参与者是否已经存在以及是否不存在,创建参与者?
Participant
的Saga中完成,如果找不到它,则发出AddParticipantCommand
,然后发出{{1}包含AddParticipantEntry
?答案 0 :(得分:2)
为了应对这种情况,你不一定需要传奇。看看我的博客文章,了解为什么不来创建聚合根,以及做什么:
答案 1 :(得分:1)
在哪里实施逻辑以检查参与者是否已经存在以及是否不存在,创建参与者?
在大多数情况下,此行为应受参与者聚合本身的控制。
当您需要协调跨多个事务边界的更改时,进程非常有用。但是,可以在同一事务中管理对同一聚合的两个更改。
你可以实现这个作为两个不同的事务在同一个聚合上运行,并进行协调;但是过程的额外复杂性并没有带来任何好处。将单个命令发送到聚合更简单,并允许它决定采取哪些操作来维护正确的不变量。
特别是,Sagas是一种恢复多个交易的模式。严翠的How the Saga Pattern manages failures with AWS Lambda and Step Functions包含旅行预订传奇的一个很好的例证。(注意:关于“saga”的定义存在相当大的混淆; NServiceBus社区倾向于理解这个术语与Garia-Molina and Salem最初描述的方式略有不同.kellabyte的Clarifying the Saga Pattern调查混淆。 )