是否可能Ninject静态属性绑定?

时间:2015-07-24 08:38:48

标签: c# dependency-injection ninject inversion-of-control

ninject是否适用于静态属性绑定?

我用Ninject设置IEventHandlerFactory

public class ServiceModule: NinjectModule
{
    public override void Load()
    {
      Kernel.Bind<IEventHandlerFactory>().To<EventHandlerFactoryService>();
    }
}

我的静态课

public static class DomainEvents
{
    public static IEventHandlerFactory EventHandlerFactory { get; set; }

    public static void Raise<T>(T domainEvent) 
    {
        EventHandlerFactory
            .GetDomainEventHandlersFor(event)
            .ForEach(h => h.Handle(event));
    }
}

但这不会绑定到静态属性。

DomainEvents.EventHandlerFactory是空的

有没有办法绑定属性?

2 个答案:

答案 0 :(得分:2)

因为ninject没有划分&#34;创建所有绑定的概念&#34;并且&#34;使用内核&#34;当然没有扩展点&#34;告诉我什么时候内核完成了所有绑定,所以我可以做一些事情&#34;。 对于静态类,从内核请求它也没有意义。

所以明显的答案是:不。

当然,显而易见的解决方案就是通过像

之类的调用来扩展您的代码,以便构建内核(可能接近您所在的var kernel = new StandardKernel())。
DomainEvents.EventHandlerFactory = kernel.Get<IEventHandlerFactory>();

备选方案1 - 将初始化与另一种类型的激活

联系起来

如果初始化应该与另一种类型的激活相关联,那么让我们说IFoo,你也可以这样做:

kernel.Bind<IFoo>()
      .To<Foo>()
      .InSingletonScope()
      .OnActivation(x => 
          DomainEvents.EventHandlerFactory = kernel.Get<IEventHandlerFactory>());

备选方案2 - 将初始化与加载NinjectModule

联系起来

您可以升级NinjectModule并在其Load中初始化静态属性。这样可以防止在内核充分初始化后创建IEventHandlerFactory来加载模块。

声明

两种选择都可能很糟糕,因为他们不清楚而且不直接。他们在某个地方隐藏了一种依赖。如果第一种方法不可行,我只使用其中一种方法,例如因为你编写了一个插件并且在内核初始化后没有扩展点。

答案 1 :(得分:0)

你真的需要DomainEvents类是静态的吗?

也许你可以这样做。虽然提升仍然是静态的。

你必须调用kernel.Get。

public class DomainEvents
{
    public static IEventHandlerFactory EventHandlerFactory { get; set; }

    public DomainEvents(IEventHandlerFactory factory)
    {
         EventHandlerFactory = factory;
    }

    public static void Raise<T>(T domainEvent) 
    {
        EventHandlerFactory
            .GetDomainEventHandlersFor(event)
            .ForEach(h => h.Handle(event));
    }
}