首页 > 解决方案 > 如何从域对象内分派域事件?

问题描述

域对象不应该有任何依赖,因此也没有依赖注入。但是,当从域对象中调度域事件时,我可能希望使用集中的EventDispatcher. 我怎么能弄到一个?

我不想将事件列表返回给调用者,因为我希望它们保持不透明并保证它们的调度。这些事件只能由需要强制执行最终一致约束的其他域对象和服务使用。

标签: dependency-injectiondomain-driven-designdomain-events

解决方案


查看Udi Dahan 的领域事件

基本上,您为域事件注册一个或多个处理程序,然后引发如下事件:

public class Customer
{
   public void DoSomething()
   {
      DomainEvents.Raise(new CustomerBecamePreferred() { Customer = this });
   }
}

并且所有注册的处理程序都将被执行:

public void DoSomethingShouldMakeCustomerPreferred()
{
   var c = new Customer();
   Customer preferred = null;

   DomainEvents.Register<CustomerBecamePreferred>(p => preferred = p.Customer);

   c.DoSomething();
   Assert(preferred == c && c.IsPreferred);
}

这基本上是在实施好莱坞原则 (不要打电话给我们,我们会打电话给你),因为你不直接调用事件处理程序 - 而是在引发事件时执行事件处理程序。


推荐阅读