我有一个使用Ninject的WCF应用程序(以及NinjectWebCommon文件)来处理大部分依赖注入需求(这是在应用程序启动时完成的);但是,我在同一个解决方案中有一个单独的项目,我希望在运行时使用内核来解决某些依赖项。如何在这个"其他"中访问我的内核?项目?它甚至可能吗?
答案 0 :(得分:2)
如何在这个“其他”项目中访问我的内核?
你不应该这样做。只有应用程序的启动路径才能引用容器/内核。这部分称为Composition Root。内核不应该在Composition Root之外引用;这将是Service Locator反模式的应用,并将导致all sorts of maintainability issues。
这里的'技巧'是在应用程序中定义一个抽象工厂接口。您可以在组合根目录中实现此工厂。这将使内核引用仅在组合根目录内,因此not result in the Service Locator反模式。
例如:
// Defined in a core layer of the application
public interface IItemProcessorFactory {
IItemProcessor GetProcessor(ItemProcessorType type);
}
在组合根目录(可以是具有多个类的类或命名空间)中,您可以定义一个实现:
// A nested type to exaggerate the fact that this is inside your Composition Root
private sealed class NinjectItemProcessorFactory : IItemProcessorFactory {
private readonly Kernel kernel;
public NinjectItemProcessorFactory(Kernel kernel) {
this.kernel = kernel;
}
public IItemProcessor GetProcessor(ItemProcessorType type) {
this.kernel.Get<IItemProcessor>(type.ToString());
}
}
工厂可以注册如下:
kernel.Bind<IItemProcessorFactory>().To<NinjectItemProcessorFactory>();