Domain driven design CQRS/ES-更改两个聚合

Domain driven design CQRS/ES-更改两个聚合,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,我对DDD有问题。我刚开始使用它,所以我没有很多经验。 有两个有界上下文:维护上下文和客户端上下文。每个客户端都有一个引擎的部件列表。维修部门是以维修为职业的仓储公司。客户可以选择每个部分的首选公司。 管理员可以暂停公司。有两种总的变化。首先,它会改变公司的状态,下一个公司应该从喜欢它的客户中删除。 处理它的最佳模式是什么? 我可以在聚合中创建两个处理程序,但当其中一个处理程序引发异常时,我如何回滚会发生变化?看起来您需要修改聚合中的一致性边界 但如果在修改之后,您仍然需要在一个事务中更改两个聚

我对DDD有问题。我刚开始使用它,所以我没有很多经验。 有两个有界上下文:维护上下文和客户端上下文。每个客户端都有一个引擎的部件列表。维修部门是以维修为职业的仓储公司。客户可以选择每个部分的首选公司。
管理员可以暂停公司。有两种总的变化。首先,它会改变公司的状态,下一个公司应该从喜欢它的客户中删除。 处理它的最佳模式是什么?
我可以在聚合中创建两个处理程序,但当其中一个处理程序引发异常时,我如何回滚会发生变化?

看起来您需要修改聚合中的一致性边界

但如果在修改之后,您仍然需要在一个事务中更改两个聚合,那么您可以考虑最终一致的系统并使用域事件(但在CQR中,您已经这样做了,不是吗?)

沃恩·弗农(Vaughn Vernon)在《实现领域驱动设计》(Implementing Domain Driven Design)一书中提出了下一种实现最终一致性的方法: 向一个或多个订阅服务器传递的聚合发布域事件。每个订阅服务器都在其自己的事务中执行(因此您仍然可以在事务中更改一个聚合)。若事务失败(订户在超时时间内未确认成功),则再次聚合发送消息或执行一些回滚例程


由于您正在使用事件源,您可以将“失败”事件标记为已拒绝并使用。

是否确实要删除它?如果它再次被取消暂停呢?那么,它真的应该从客户偏好中永远消失吗?:)好啊也许这不是最好的例子。我考虑如何解决情况,当我必须用两个集合进行更改时,处理程序可能会抛出异常。理想情况下,您不希望它们之间存在依赖关系。出于兴趣,对于包含客户首选公司列表的第二个聚合,您对此有什么样的域逻辑?在我看来,您的read模型中只有一个视图,其中包含由聚合引发的事件生成的首选列表(您不会有首选公司agg)。因此,在这种情况下,当一家公司被暂停时,该公司的暂停事件将由首选列表事件处理程序处理,客户关联人员将被删除……Chris Moutray:你是对的。我不必累计存储有关客户偏好的信息。它们存储在读取模型中,因此我可以使用事件。