首页 > 解决方案 > CQRS - 一个命令触发其他命令/由其他命令组成

问题描述

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

我想知道的具体情况是我有一个“CreateAppointmentNote”命令,可以为现有约会创建注释。我还有一个创建约会的“CreateAppointment”命令(没有Notes)。

我需要添加功能,如果“CreateAppointment”命令中使用的对象具有注释值,那么它也需要创建注释。'CreateAppointment' 命令可以调用'CreateAppointmentNote' 命令来执行此操作吗?

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

我认识到我可以调用约会命令然后调用注释命令,但是如果将约会添加到数据库成功但添加注释失败,这可能会让我感到奇怪的部分成功。

我只是想找出在 CQRS 中干净地执行此操作的正确方法,并尽可能避免将代码从一个命令复制到另一个命令。

标签: c#cqrs

解决方案


约会和笔记有什么关系?它们是否属于同一聚合的一部分,如果是,您的任命是否充当聚合根(因此负责“保护”笔记)?没有成功创建笔记就成功创建约会是否会使交易无效?

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

如果它们是完全独立的服务/聚合,必须一起创建才能有效,那么您可以考虑类似saga 模式的东西,它可以确保整个事务通过或回滚,但可能值得一看您的聚合边界以查看它们是否实际上应该位于单个聚合下。

引用cqrs.nu

我知道聚合是事务边界,但我确实需要在同一个事务中以事务方式更新两个聚合。我该怎么办?

您应该重新考虑以下问题:

  • 您的总边界。
  • 每个聚合的职责。
  • 在阅读方面或传奇中,您可以逃脱惩罚。
  • 您的域的实际非功能性需求。

如果您编写了一个解决方案,其中两个或多个聚合是事务耦合的,那么您还没有理解聚合。


推荐阅读