【问题标题】:Inter-Aggregate Communication in CQRS + DDD + Event SourcingCQRS + DDD + 事件溯源中的聚合间通信
【发布时间】:2011-03-07 12:09:56
【问题描述】:

在使用事件溯源聚合后端基于 DDD 原则构建的环境中,独立的 aggregate roots (AR) 应如何相互通信?

例如,我有一个 Facility 聚合根 (AR),它有一个负责创建 Booking AR 的工厂方法。 BookingPerson AR 和 Facility AR 的时间敏感组合。一个Person 只能在一个Facility 中预订。

在 DDD 中,我会在 Person 中引用 Booking,在 Facility 中引用 Person。但是,在生成用于事件溯源的事件时,我认为尝试从后端处理事件反序列化会变得令人望而却步。因此,我只保留对基于值对象的唯一 ID 的引用。然而,这带来了一个新问题,当 AR 上的一个方法需要调用另一个 AR 上的另一个方法时——你如何处理这种情况?从域 AR 中访问事件源存储库?

这种情况下的一般用例是什么?我是不是把这一切都搞错了?

【问题讨论】:

    标签: domain-driven-design cqrs event-sourcing


    【解决方案1】:

    聚合根边界定义了一致性边界。 在聚合内部,一致性得到保证。 外面……不是。 所以你不应该有跨越多个聚合的操作并且必须是一致的。 如果您需要跨越两个聚合的事务,则应查看聚合边界。

    对于聚合之外发生的事情,您应该有一个事件处理程序,它将向其他聚合发送命令。 如果聚合之间的动作逻辑比较复杂,你可以定义一个进程,一个状态机,它将监听事件并向聚合发送命令。 流程可用于定义长时间运行的事务(使用补偿而不是回滚),或根据系统中发生的大规模情况(甚至在有界上下文之间)做出业务决策。

    【讨论】:

    【解决方案2】:

    当使用事件溯源和 CQRS 时,最优雅的(至少在我看来)AR 间通信的方式是消息传递。您可以查看Ncqrs 项目(如果您是 .NET 人员会更容易),尤其是“消息传递”分支。这个想法是,AR 为它们处理的每种消息类型实现 IMessageHandler 接口,并且 AR 基类公开方法 Send 用于发送消息。通过这个 API,客户端可以调用模型行为,模型本身可以(在 AR 之间)进行通信。

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 2014-09-29
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多