如何使用事件源聚合后端在DDD原则构建的环境中单独aggregate roots(AR)相互通信?
例如,我有一个Facility
聚合根(AR),其工厂方法负责创建Booking
AR。 Booking
是Person
AR和Facility
AR的时间敏感组合。 Person
只能在一个Facility
中预订。
在DDD中,我会在Booking
中引用Person
,在Person
中引用Facility
。但是,当生成用于事件源的事件时,我认为尝试从后端处理事件反序列化将变得令人望而却步。因此,我只采用了对基于对象的值唯一id的引用。然而,这会带来一个新问题,当AR上的方法需要在另一个AR上调用另一个方法时 - 您如何处理这种情况?从域AR?
此方案中的一般用例是什么?我接近这一切都错了吗?
答案 0 :(得分:42)
聚合根边界定义一致性边界。 在聚合内部,保证了一致性。 外面......不是。 因此,您不应该拥有跨越多个聚合的操作,并且必须保持一致。 如果您需要跨越两个聚合的事务,则应检查聚合边界。
对于在聚合之外发生的事情,您应该有一个事件处理程序,它将命令发送到其他聚合。 如果聚合之间的操作逻辑更复杂,您可以定义一个进程,一个将侦听事件并将命令发送到聚合的状态机。 流程可用于定义长时间运行的事务(使用补偿而不是回滚),或者根据系统中大规模发生的事情(甚至在有界上下文之间)做出业务决策。
答案 1 :(得分:4)
当使用Event Sourcing和CQRS时,最优雅(至少在我看来)AR间通信的方式是消息传递。您可以查看Ncqrs项目(如果您是.NET人员会更容易),特别是“消息传递”分支。这个想法是,AR为它们处理的每种消息类型实现IMessageHandler接口,AR基类公开方法Send用于发送消息。通过此API,客户端可以调用模型行为,模型本身可以进行通信(在AR之间)。