【发布时间】:2010-06-15 08:03:48
【问题描述】:
我们有一个具体的单例服务,它实现了Ninject.IInitializable 和 2 个接口。问题是服务 Initialize-methdod 被调用了 2 次,而只需要一次。我们正在使用 .NET 3.5 和 Ninject 2.0.0.0。
Ninject 中是否有防止这种情况发生的模式。这两个接口都没有实现Ninject.IInitializable。服务类是:
public class ConcreteService : IService1, IService2, Ninject.IInitializable
{
public void Initialize()
{
// This is called twice!
}
}
模块看起来像这样:
public class ServiceModule : NinjectModule
{
public override void Load()
{
this.Singleton<Iservice1, Iservice2, ConcreteService>();
}
}
其中 Singleton 是这样定义的扩展方法:
public static void Singleton<K, T>(this NinjectModule module) where T : K
{
module.Bind<K>().To<T>().InSingletonScope();
}
public static void Singleton<K, L, T>(this NinjectModule module)
where T : K, L
{
Singleton<K, T>(module);
module.Bind<L>().ToMethod(n => n.Kernel.Get<T>());
}
当然,我们可以将 bool initialized-member 添加到 ConcreteService 并仅在它为 false 时才进行初始化,但这似乎有点 hack。而且它需要在实现两个或多个接口的每个服务中重复相同的逻辑。
感谢所有答案!我从他们所有人身上学到了一些东西! (我很难决定哪一个标记是正确的)。
我们最终创建了 IActivable 接口并扩展了 ninject 内核(它还很好地删除了对 ninject 的代码级依赖,尽管属性仍然存在)。
【问题讨论】:
-
IStartable 是否与 Initializable 一样被多次调用? (也许它没有......)
-
确实如此,至少是这个问题中描述的方式。
-
BTW v3 有一个cleaner interface for binding multiple interfaces on an type (虽然我不确定它是否解决了多个-
IInitialization 问题。如果有人需要答案,我建议提出一个新问题,毫无疑问@ Remo Gloor 会扑向它!
标签: ninject