可以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
是否有绑定属性的方法?
由于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));
}
}