代码之家  ›  专栏  ›  技术社区  ›  JD Courtoy

在CQR+DDD+事件源中进行聚合通信

  •  24
  • JD Courtoy  · 技术社区  · 16 年前

    如何分开 aggregate roots (ar)在基于DDD原则的环境中,使用事件源聚合后端进行相互通信?

    例如,我有一个 Facility 聚合根(ar),其工厂方法负责创建 Booking A. 预订 是时间敏感的 Person AR和A 设施 A 只能订单人间 设施 .

    在DDD中,我会提到 预订 在里面 在里面 设施 . 但是,当生成事件以用于事件源代码时,我认为试图从后端处理事件反序列化将变得非常禁止。因此,我只保留对基于值对象的唯一ID的引用,这带来了一个新问题,但是,当ar上的一个方法需要在另一个ar上调用另一个方法时——您如何处理这种情况?点击域ar中的事件源存储库?

    这个场景中的一般用例是什么?我是不是都错了?

    2 回复  |  直到 9 年前
        1
  •  42
  •   thinkbeforecoding    10 年前

    聚合根边界定义一致性边界。 在集料内部,确保一致性。 在外面…不是这样。 因此,您不应该有跨越多个聚合的操作,并且必须保持一致。 如果需要跨越两个聚合的事务,则应检查聚合边界。

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

        2
  •  4
  •   thanhpk    9 年前

    当使用事件源和CQR时,最优雅(至少在我看来)的AR间通信方式是消息传递。你可以看看 Ncqrs 项目(如果你是一个.NET的人,这会更容易),特别是“消息传递”分支。其思想是,ars为其处理的每种消息类型实现IMessageHandler接口,ar基类公开用于发送消息的方法send。通过这个API,客户机可以调用模型行为,模型本身可以通信(在ARS之间)。

    推荐文章