Domain driven design CQRS和x2B中的聚合间通信;DDD+;活动来源
在基于DDD原则构建的环境中,使用事件源聚合后端,分离(AR)应该如何相互通信 例如,我有一个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
设施
聚合根(AR),它有一个工厂方法负责创建预订
AR。预订
是人员
AR和设施
AR的时间敏感组合。人员
只能在单个设施
中预订
在DDD中,我会在Person
中保存对预订的引用,并在设施中保存对Person
的引用。但是,当生成事件以用于事件源时,我认为尝试从后端处理事件反序列化将变得令人望而却步。因此,我已经习惯于只保存对基于对象的唯一id的值的引用。然而,这带来了一个新问题,当AR上的一个方法需要调用另一个AR上的另一个方法时——您如何处理这种情况?从域AR中点击事件源存储库
这个场景中的一般用例是什么?我这样做完全错了吗?当使用事件源和CQR时,最优雅的(至少在我看来)AR间通信方式是消息传递。你们可以看看这个项目(若你们是一个.NET的人,这会更容易),尤其是“消息传递”分支。其思想是,ARs为其处理的每种消息类型实现IMessageHandler接口,并且AR基类公开方法Send以向其发送消息。通过此API,客户端可以调用模型行为,模型本身可以(在AR之间)通信。聚合根边界定义一致性边界。
在骨料内部,保证了一致性。
外面。。。不是。
因此,您不应该有跨多个聚合的操作,并且必须保持一致。
如果您需要跨两个聚合的事务,则应查看聚合边界
对于聚合之外发生的事情,您应该有一个事件处理程序,它将向其他聚合发送命令。
如果聚合之间的操作逻辑更复杂,您可以定义一个进程,一个状态机,它将侦听事件并向聚合发送命令。
流程可用于定义长时间运行的事务(使用补偿而不是回滚),或根据系统中大规模发生的情况(甚至在有限的上下文之间)做出业务决策。回答得好-如果您碰巧想进一步深入了解此主题,您可能会发现此帖子很有帮助: