域事件处理程序 - 它们是否应该用于应用程序层问题?

时间:2011-01-08 01:00:14

标签: architecture domain-driven-design domain-events

实施域事件时,事件处理程序应仅用于纯域关注;您将与业务专家讨论的内容,或者是否可以被对域模型感兴趣的任何内容使用?

最好用一个简单的例子来解释这个问题,考虑使用Calendar应用程序为员工安排工作。

我们可能会遇到以下域名事件......

AppointmentAdded AppointmentRemoved AppointmentContentChanged AppointmentMoved

我们有这些事件的处理程序,例如当约会被移动到员工工作时间之外的时间时,我们设置警告标志。

当然,对这些事件感兴趣的应用程序问题,例如当一个约会被添加到日历中时,我们应该将它添加到工作单元中,以便我们可以在以后提交更改。

这些应用程序问题是否应该是域事件的消费者,或者我们应该提出并处理单独的系统事件?

2 个答案:

答案 0 :(得分:5)

在DDD解决方案中使用事件有两种完善的方法。

第一个是基于Udi Dahan的articles about events。如果您还没有阅读过,我强烈建议您这样做。总之,它表示除了正常的ORM样式行为外,还使用静态类发布事件。因此,您向客户的订单集合添加订单您发布活动。因为您的域行为是在事务范围内执行的,所以事件处理程序也是如此。您也可以在那里找到并建议不要将对象手动附加到工作单元。应该通过调用现有的行为来创建新的聚合根。

Greg Young还推出了另一种选择。它基于事件采购,基本上使用事件作为持久状态的手段。在这种方法中,您的聚合根通常使用一些基础结构(例如基本聚合根类)来应用事件。 Apply会在聚合根类上调用事件处理程序,而会在总线上发布此事件(无论您使用哪种总线实现)。

答案 1 :(得分:2)

如果您的意思是跨领域的问题,那么如果您的应用程序逻辑需要它,您将被迫使用它。因此它将与其他事件处理代码混合使用。

但是,如果您在域事件发生时需要做几个独立的事情,那么最好使用单独的事件处理程序(参见Separation Of Concerns原则)。

顺便说一下,在第一种情况下,尽量避免将域逻辑与事件处理(基础结构)逻辑混合。左基础设施/横切关注涉及调用域方法的事件处理程序中的代码。在域对象的方法中移动域代码。