dependency-injection - 如何从域对象内分派(dispatch)域事件?

标签 dependency-injection domain-driven-design domain-events

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

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

最佳答案

Udi Dahan's domain events

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

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);
}


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

关于dependency-injection - 如何从域对象内分派(dispatch)域事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52992492/

相关文章:

domain-driven-design - DDD 中两个限界上下文之间的通信

testing - 了解 symfony2 依赖注入(inject)容器的 PHPUnit 测试用例

c# - 依赖注入(inject)和类继承

jakarta-ee - 如何将 "inject"目录路径放入 Web 应用程序以部署到 Tomcat?

design-patterns - 为什么应该将域实体与表示层隔离?

c# - 使用 Autofac 立即创建 ViewModel 实例

domain-driven-design - 通过聚合根 : simple example? 访问实体

asp.net-mvc - ASP.NET MVC 中的 DDD、 View 模型和验证

asp.net-mvc - 在哪里引发与持久性相关的域事件-服务,存储库或UI?