繁体   English   中英

Ninject静态属性可以绑定吗?

[英]Is possible Ninject static property binding?

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为Null

有什么方法可以绑定财产吗?

由于ninject没有将“创建所有绑定”和“使用内核”分开的概念,因此“在内核完成所有绑定后告诉我,以便我可以做某事”当然没有扩展点。 对于静态类,从内核请求它也是没有意义的。

因此,显而易见的答案是:不。

当然,显而易见的解决方案是使用如下调用将代码扩展到完成内核构建的位置(可能接近您执行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中初始化static属性。 如果您可以确保仅在内核充分初始化以创建IEventHandlerFactory之后才加载模块,则此方法IEventHandlerFactory

放弃

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

您真的需要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));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM