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
是空的
有没有办法绑定属性?
答案 0 :(得分:2)
因为ninject没有划分&#34;创建所有绑定的概念&#34;并且&#34;使用内核&#34;当然没有扩展点&#34;告诉我什么时候内核完成了所有绑定,所以我可以做一些事情&#34;。 对于静态类,从内核请求它也没有意义。
所以明显的答案是:不。
当然,显而易见的解决方案就是通过像
之类的调用来扩展您的代码,以便构建内核(可能接近您所在的var kernel = new StandardKernel()
)。
DomainEvents.EventHandlerFactory = kernel.Get<IEventHandlerFactory>();
如果初始化应该与另一种类型的激活相关联,那么让我们说IFoo
,你也可以这样做:
kernel.Bind<IFoo>()
.To<Foo>()
.InSingletonScope()
.OnActivation(x =>
DomainEvents.EventHandlerFactory = kernel.Get<IEventHandlerFactory>());
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));
}
}