谁应该负责处理域名事件?应用服务,域服务或实体本身?
让我们用这个问题的简单例子。
假设我们在商店应用程序上工作,我们有一个专门用于订单操作的应用程序服务。在此应用程序Order
是聚合根和遵循规则,我们只能在单个事务中使用一个聚合。下订单后,它将保留在数据库中。但还有更多工作要做。首先,我们需要更改清单中可用的项目数量,然后通知系统的其他部分(可能是另一个有界的上下文),应该启动该特定订单的运输程序。因为,如前所述,我们只能修改事务中的一个聚合,我考虑发布将由单独事务中的某些组件处理的OrderPlacedEvent
。
出现问题:哪些组件应该处理此类事件?
答案 0 :(得分:8)
我想:
1)如果事件触发在同一有界上下文中修改另一个聚合,则为应用层。
2)如果事件触发某些基础结构服务,则为应用层。
e.g。电子邮件将发送给客户。因此,需要一个应用程序服务来加载邮件内容和邮件的订单,然后调用基础结构服务来发送邮件。
3)如果事件在另一个有界上下文中触发某些操作,我个人更喜欢域服务。
e.g。运输或计费,域服务的基础设施实施负责整合其他有界环境。
4)如果事件需要拆分为多个消费者,则为基础设施层。消费者转到1),2)或3)。
对我而言,如果事件导致对您的有限上下文进行单独的验收测试,则结论是应用层。
顺便说一句,您的基础设施是什么来确保活动的持久性?您是否在事务中包含事件发布?
答案 1 :(得分:4)
这些处理程序属于应用程序层。您也应该创建一个支持应用程序服务的方法。这样您就可以开始单独的交易。
答案 2 :(得分:0)
我认为放置EventHandlers的最常见,最常用的地方是application layer
。用CQRS进行类比,EventHandler与CommandHandler非常相似,我通常将它们彼此靠近(在应用程序层中)。
This article还提供了一些将处理程序放置到此处的示例。看下面的图片,摘自相关文章: