繁体   English   中英

在DDD中,谁应该负责处理域事件?

[英]In DDD, who should be resposible for handling domain events?

谁应该负责处理域名事件? 应用服务,域服务或实体本身?

让我们用这个问题的简单例子。

假设我们在商店应用程序上工作,我们有一个专门用于订单操作的应用程序服务。 在此应用程序中, Order是聚合根和遵循规则,我们只能在单个事务中使用一个聚合。 下订单后,它将保留在数据库中。 但还有更多工作要做。 首先,我们需要更改清单中可用的项目数量,然后通知系统的其他部分(可能是另一个有界的上下文),应该启动该特定订单的运输程序。 因为, OrderPlacedEvent ,我们只能修改事务中的一个聚合,我想发布OrderPlacedEvent单独事务中的某些组件处理的OrderPlacedEvent

问题出现了:哪些组件应该处理这类事件?

我想:

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

2)如果事件触发某些基础结构服务,则为应用层。

例如,向客户发送电子邮件。 因此,需要一个应用程序服务来加载邮件内容和邮件的订单,然后调用基础结构服务来发送邮件。

3)如果事件在另一个有界上下文中触发某些操作,我个人更喜欢域服务。

例如,运输或计费,域服务的基础结构实现负责集成其他有界上下文。

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

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

那么,您的基础设施是什么来确保您的活动的持久性? 您是否在交易中包含事件发布?

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

我认为放置EventHandler最常见和最常见的地方是application layer 使用CQRS进行类比,EventHandler与CommandHandler非常相似,我通常将它们彼此靠近(在应用程序层中)。

微软的这篇文章也提供了一些将处理程序放在那里的例子。 看一下下面的图片,取自相关文章:

积极和处理程序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM