使用域事件(DDD)在聚合之间进行通信的责任

时间:2017-06-14 12:50:16

标签: event-handling domain-driven-design application-layer

一般问题:谁负责处理单个命令中包含的事件?

简化示例

提供了两个聚合:UserGame

要使用Game命令启动StartGameUser必须接受。就我的域驱动解决方案而言,这会产生以下事件流:GameRequested - > UserAcceptedUserRejected - > GameStartedGameFailed

此事件流和相应的业务逻辑代码是域的一部分,因此我想在域层中规定该行为。但通常我会看到应用程序层执行所有事件处理并在聚合上执行行为以弥补差距。应用程序层是否真正负责确定必须调用哪个聚合(以及如何)继续执行此GameStart - 命令过程(跨越多个聚合和事件)?

1 个答案:

答案 0 :(得分:1)

  

应用层是否真正负责确定下一步必须调用哪个聚合(以及如何)继续执行此GameStart命令过程(跨越多个聚合和事件)?

是的,但它经常不会出现。

基本前提是 - 从域模型的角度来看,每个命令只修改一个聚合。这些命令通常存在于单个事务的范围内。

现在,有一些模式,其中应用程序组件中处理的单个消息可能需要与域模型协调多个命令。

执行此操作的一个原因可能是复合用户界面 - 应用程序接收单个消息(FormSubmitted,HttpRequestReceived),并将该消息转换为针对不同服务调用的各种命令。见Udi Dahan的Putting your events on a diet

可能发生这种情况的另一个原因是,如果您试图保持与以前用于在单个聚合中处理消息的api的向后兼容性,现在以两个为止。

实现这一目标的一种方法是使用状态机; "流程经理"是一个有时你会在文献中找到的术语。它只是一个用于跟踪已发生事件以及接下来需要发生的事情的协议的流行术语。