在领域驱动设计中,谁应该负责处理领域事件?

11
谁应该负责处理领域事件?是应用程序服务、领域服务还是实体本身?
让我们为这个问题举一个简单的例子。假设我们正在开发一款商店应用程序,并且我们有一个专门用于订单操作的应用程序服务。在这个应用中,Order 是一个聚合根,根据以下规则,我们只能在单个事务内处理一个聚合。下单后,它会被持久化到数据库中。但还有更多工作要做。首先,我们需要改变库存中可用物品的数量,其次通知系统的某些其他部分(可能是另一个有界上下文),应该开始针对特定订单的运输流程。因为,如前所述,我们只能在一个事务内修改一个聚合,所以我考虑发布OrderPlacedEvent,由一些组件在独立的事务中处理。
问题出现了:哪些组件应该处理这种类型的事件?
3个回答

10

我想要:

1)如果事件触发同一有界上下文中另一个聚合的修改,则使用应用层。

2)如果事件触发某些基础设施服务,则使用应用层。

例如:发送电子邮件给客户,因此需要应用程序服务来加载邮件内容和邮件接收者,然后调用基础设施服务发送邮件。

3)如果事件触发另一个有界上下文中的操作,则个人更喜欢使用领域服务。

例如:Shipping或Billing,领域服务的基础设施实现负责集成其他有界上下文。

4)如果事件需要拆分为多个消费者,则使用基础设施层。消费者可以去1),2)或3)。

对我来说,结论是,如果事件导致您的有界上下文需要单独的验收测试,则使用应用层。

顺便问一下,你们的基础设施如何确保事件的持久性?你们是否在事务中包含事件发布?


谢谢您的回复。关于耐久性 - 我还不知道如何组织它。我认为理想情况下,我们应该有两个事务和一些耐用队列(JMS?)-事件在同一个事务中发布,因此我们确保它已经正确传递,并且当消息从队列中取出时启动另一个事务。这样,我们可以确保如果出现问题,事件将被重新传递。 - woof-woof
@yugang-zhou,我无法看到第三种情况。你能给我一个例子吗?非常感谢你的时间。 - Mr. Mars

4

这些处理程序属于应用层。你可能还应该创建一个支持应用服务方法。这样你就可以开始单独的事务。


3

我认为最常见和通常的放置事件处理程序的地方是在应用层。与CQRS类比,EventHandlers非常类似于CommandHandlers,我通常将它们放在一起(在应用层)。

这篇文章来自微软,也给出了一些在那里放置处理程序的示例。请看下面的图片,摘自相关文章:

Aggreagates and Handlers


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接