DDD事件处理器属于哪一层

To which layer in DDD event handlers belongs

我们目前正在使用 域驱动设计 命令和事件。 我无法决定事件处理程序和命令处理程序应该驻留在 DDD 的哪一层。

我的感觉是它应该驻留在应用层,但我没有合适的论据。 我对应用层的简单理解是,应用层协调业务任务,不持有任何域状态

事件处理程序是协调器,它对消息作出反应并调用域对象来完成它们的任务。 大多数时候,事件处理程序只决定接下来将调用哪个 command/event(message)。或者在领域层调用一些API或其他领域逻辑,在进一步的消息执行之前完成任务。

这就是我认为事件和命令处理程序应该驻留在应用层的原因。

但是,现在它变得越来越复杂。我们也在使用 Process Managers。 它们处理事件的方式与事件处理程序相同。但它们包含临时状态。 此外,它们是如何构造的,它们也是业务逻辑的持有者。您可以从中了解事件是如何链接的以及完成此特定过程必须实现的目标。

我该如何威胁他们?它们属于应用层还是领域层?

总结:

  1. 事件处理器属于应用层吗?
  2. 命令处理程序属于应用层吗?
  3. Process Managers属于应用层吗?

事件处理器属于应用层吗?
事件处理程序位于 Application Layer,有时位于 Domain layer
Application layer event handlers 本质上更基础,执行发送 e-mails 和将事件发布到其他有界上下文等任务。
职责:

  • 触发与外部限界上下文的通信,调用另一个域来做某事
  • 管理与外部服务的通信
  • 可能会通知用户有关更改
  • 通过消息基础设施转发事件

Domain layer event handlers 调用域逻辑,例如调用域服务。
职责:

  • 在一个限界上下文中处理 domain-specific 逻辑
  • 委托给域服务


总结: 纯粹执行域逻辑的事件处理程序最好放在 Domain Layer,但其他的只能放在 Application Layer

命令处理程序属于应用层吗?
是的。
事件代表过去,已经发生且无法挽回的事情。它们是业务领域及其无处不在的语言的一部分。另一方面,命令代表一种愿望,一种可以拒绝的未来行动。命令通常是用户操作的结果。在 Domain Layer 中,我们没有用户操作。命令处理程序通过编排业务操作的工作流来处理命令,并有效地替代此作业中的应用程序服务。所以 Command Handlers 的正确位置是 Application Layer.

Process Managers属于应用层吗?
是的。
流程管理器协调跨越多个有界上下文的业务流程。它封装了 process-specific 逻辑并维护了一个中心控制点。换句话说,它是一个编排器,不包含任何业务规则。所以它必须属于 Application Layer