Domain driven design CQRS和x2B中的聚合间通信;DDD+;活动来源

Domain driven design CQRS和x2B中的聚合间通信;DDD+;活动来源,domain-driven-design,cqrs,event-sourcing,Domain Driven Design,Cqrs,Event Sourcing,在基于DDD原则构建的环境中,使用事件源聚合后端,分离(AR)应该如何相互通信 例如,我有一个设施聚合根(AR),它有一个工厂方法负责创建预订AR。预订是人员AR和设施AR的时间敏感组合。人员只能在单个设施中预订 在DDD中,我会在Person中保存对预订的引用,并在设施中保存对Person的引用。但是,当生成事件以用于事件源时,我认为尝试从后端处理事件反序列化将变得令人望而却步。因此,我已经习惯于只保存对基于对象的唯一id的值的引用。然而,这带来了一个新问题,当AR上的一个方法需要调用另一个A

在基于DDD原则构建的环境中,使用事件源聚合后端,分离(AR)应该如何相互通信

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

在DDD中,我会在
Person
中保存对
预订
的引用,并在
设施中保存对
Person
的引用。但是,当生成事件以用于事件源时,我认为尝试从后端处理事件反序列化将变得令人望而却步。因此,我已经习惯于只保存对基于对象的唯一id的值的引用。然而,这带来了一个新问题,当AR上的一个方法需要调用另一个AR上的另一个方法时——您如何处理这种情况?从域AR中点击事件源存储库


这个场景中的一般用例是什么?我这样做完全错了吗?

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

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

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

回答得好-如果您碰巧想进一步深入了解此主题,您可能会发现此帖子很有帮助: