DDD:将域事件处理程序放在哪里?


13

您能否告诉我您的观点,哪一层适合将域事件处理程序放置在DDD中?例如,我有应用程序服务来添加新合同,并且我想在合同添加后向联系人发送电子邮件通知,电子邮件发件人(处理ContractAdded事件)应用程序服务或域服务还是还有什么吗

Answers:


12

我将域事件处理程序放置在应用程序层中。

域事件是一种告诉外部层(或外部世界)域层中发生了某些事情的方法。该事件的处理方式取决于应用程序。应用程序可以通知用户有关更改的信息,也可以调用另一个域来执行某项操作。应用程序负责协调域操作,以响应用户操作,Web请求或域事件。


1
应用程序层为+1。在发布订阅设计中,域事件可以激活不同位置/系统/微服务中的通用逻辑。如果订户之一是使用DDD建模的应用程序,则该事件正在触发该应用程序/ BC中的某些处理。此处理可能需要事务划分,访问控制,协调,通常在应用程序层执行。
Paulo Merson

2

最初的DDD书(Evans 2004)将应用程序层解释为一个薄层,用于响应用户的操作来练习域对象。因此,域事件的典型事件处理程序不属于应用程序层。

只要您不通过创建向上依赖项破坏层次结构,就可以将其中一些放置在域层中。

如果您的基础结构层位于域层之下,则​​事件处理程序将不存在,因为它将破坏分层。

如果您的适配器层位于域层之上,则可以在其中创建事件处理程序。查看六角建筑


2

我将“域事件处理程序”放置在“域”层中作为域接口IDomainEventHandler

域事件处理程序的一个示例是订阅某个域事件以初始化新事务的策略(例如:为了触发新域命令),因此将其放在域层是有意义的,因为它与商业逻辑。

我们可以考虑一个示例,在该示例中确认了订单,因此应创建发票请求。我们发生了一件大事OrderConfirmedEvent。我们域中的策略将负责订阅此事件并创建RequestInvoice将由命令处理程序处理并由其相应处理的域命令。

如果我们在应用程序层中拥有此事件处理程序,则意味着该应用程序层除了协调用户的操作外,还将执行一些业务逻辑,这似乎是不正确的。

但是我们有

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.