CQRS - 一个命令触发其他命令组成的其他命令。

问题描述 投票:1回答:1

一个命令可以触发CQRS中的其他命令或由其他命令组成吗?

我想知道的具体情况是,我有一个 "CreateAppointmentNote "命令,可以为现有的预约创建一个备注。我也有一个 "CreateAppointment "命令,可以创建一个预约(withoutNotes)。

我需要添加这样的功能:如果'CreateAppointment'命令中使用的对象有备注的值,那么它也需要创建备注。'CreateAppointment'命令能否调用'CreateAppointmentNote'命令来实现这个功能?

这背后的最终目标是让一个对约会POST端点的调用能够添加注释,而不是在初始创建一个有注释的约会时,也必须调用另一个端点来获取注释。

我认识到我可以先调用appointment命令,然后再调用notes命令,但是这可能会让我出现一个奇怪的部分成功的情况,如果将appointment添加到db中成功,但是将notes添加失败。

我只是想弄清楚在CQRS中正确的方法,如果可能的话,避免将一个命令的代码复制到另一个命令中。

c# cqrs
1个回答
1
投票

约会和备注之间的关系如何?它们是否是同一个集合的一部分,如果是的话,你的约会是否作为集合的根(因此负责 "保护 "笔记)?预约成功创建而票据没有成功创建,是否会导致交易无效?

如果票据是创建新任命的事务的基本部分,并且是任命集合的一部分,那么它们反映了一起变化的事物,可以是同一个命令的一部分。CreateAppointment 可以包含任何笔记相关的属性,作为创建请求的一部分,那么一个 AddNoteToAppointment 可以管理后续的笔记一个现有的约会。

如果它们是完全独立的服务聚合,必须一起创建才有效,那么你可以考虑像 传奇模式 这可以确保整个交易要么通过,要么回滚,但它可能值得看看你的集合边界,看看他们是否应该,事实上,而不是在一个单一的集合下。

引用 cqrs.nu:

我知道聚合是事务边界,但我真的需要在同一个事务中事务性地更新两个聚合。我应该怎么做?

你应该重新思考以下问题。

  • 你的聚合边界
  • 每个聚合的职责。
  • 你在读边或在传奇中可以摆脱的事情。
  • 你的领域的实际非功能需求。

如果你写的解决方案中,两个或多个聚合是事务性耦合的,你就没有理解聚合。

© www.soinside.com 2019 - 2024. All rights reserved.