可以ject静态属性绑定

本文关键字:绑定 属性 静态 ject 可以 | 更新日期: 2023-09-27 18:04:21

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

但是这并不绑定到static属性。

DomainEvents.EventHandlerFactory为Null

是否有绑定属性的方法?

可以ject静态属性绑定

由于ninject没有区分"创建所有绑定"answers"使用内核"的概念,因此当然没有"告诉我内核何时完成所有绑定,以便我可以做些什么"的扩展点。对于静态类,从内核请求它也没有意义。

所以很明显的答案是:不

当然,最明显的解决方案是扩展你的代码,你已经完成构建内核(可能接近你做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之后才加载模块,则此方法有效。

免责声明

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

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

也许你可以这样做。Raise仍然是静态的

你必须调用kernel。尽管。

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