【问题标题】:Using Ninject with Udi Dahan's Domain Events将 Ninject 与 Udi Dahan 的领域事件一起使用
【发布时间】:2012-10-22 16:16:07
【问题描述】:

我在 MVC 项目中使用 Ninject,并尝试按照 Udi Dahan 的模式 http://www.udidahan.com/2009/06/14/domain-events-salvation/ 实现域事件

在下面的摘录中,“容器”用于解析已引发的特定类型事件的所有事件处理程序。

我的问题(如果我遗漏了一些基本的东西,请道歉)是如何使用 Ninject 做到这一点?换句话说:

  1. 如何在这个静态类中设置“Container”?

  2. 一旦我有了一个容器(内核?),解决所有事件处理程序的 Ninject 语法是什么(我假设我必须事先在服务模块中注册)?

我一直在帖子中阅读,应该只使用构造函数注入,并且一切都将从中递归解决,并且访问 Ninject Kernel 是一个禁忌。因此,任何有关如何执行此操作的建议都将不胜感激。

文章摘录

public static class DomainEvents
{ 
  [ThreadStatic] //so that each thread has its own callbacks
  private static List<Delegate> actions; 

  public static IContainer Container { get; set; } //as before

  //Registers a callback for the given domain event
  public static void Register<T>(Action<T> callback) where T : IDomainEvent
  {
     if (actions == null)
        actions = new List<Delegate>();

     actions.Add(callback);
 }

 //Clears callbacks passed to Register on the current thread
 public static void ClearCallbacks ()
 {
     actions = null;
 }

 //Raises the given domain event
 public static void Raise<T>(T args) where T : IDomainEvent
 {
    if (Container != null)
       foreach(var handler in Container.ResolveAll<Handles<T>>())
          handler.Handle(args);

    if (actions != null)
        foreach (var action in actions)
            if (action is Action<T>)
                ((Action<T>)action)(args);
 }
}

【问题讨论】:

标签: asp.net-mvc dependency-injection inversion-of-control ninject domain-events


【解决方案1】:

如何在这个静态类中设置“容器”?

您必须在应用程序启动期间进行设置:

DomainEvents.Container = kernel;

解析所有事件处理程序的 Ninject 语法是什么:

你可以这样做,例如:

Container.Get<IEnumerable<Handles<T>>>())

Udi 的静态 DomainEvents 类是 Ambient Context 反模式的实现(参见 DI PP&P 章节 5.3)。在这种情况下,我宁愿使用依赖注入将IDomainEvents 抽象注入需要它的代码中,而不是让代码依赖于静态实例。

然而,问题是您的域对象将需要对IDomainEvents 的依赖,并且构造函数注入(可能)是不可能的。诀窍是在这种情况下使用方法注入。

换句话说,使用构造函数注入将IDomainEvents 注入到命令处理程序或服务(或者您调用的使用域对象上的方法的业务逻辑),并在调用时将该依赖项传递给域对象需要它的方法(方法注入)。

【讨论】:

  • 非常感谢您的回答 - 给了我一些有用的指示。我正在为 MVC 使用 Ninject 的 NuGet 实现,因此将在 App_Start/NinjectWebCommon 类中的某处设置 DomainEvents.Controller。我认为我必须坚持使用静态 DomainEvents 类,因为在此阶段无法将 IDomainEvents 注入我的所有实体框架代码优先模型。静态 DomainEvents 仍然是可单元测试的(如 Udi 的原始文章中所述),所以我可以接受。再次感谢。
  • 除了通过方法注入IDomainEvents,您还可以让您的域对象实现IRecordEvents之类的东西,并让上层将记录的事件转发给调度程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 2012-09-17
  • 2014-10-28
相关资源
最近更新 更多