5

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

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

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

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

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

1 回答 1

6

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

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

DomainEvents.Container = kernel;

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

你可以这样做,例如:

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

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

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

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

于 2012-10-23T08:23:21.027 回答