【发布时间】:2014-04-19 16:37:07
【问题描述】:
我有一个 WCF 应用程序,它使用 Ninject(连同 NinjectWebCommon 文件)在很大程度上满足我的依赖注入需求(这是在应用程序启动时完成的);但是,我在同一个解决方案中有一个单独的项目,我想使用内核在运行时解决一些依赖项。如何在这个“其他”项目中访问我的内核?有没有可能?
【问题讨论】:
标签: c# dependency-injection ninject
我有一个 WCF 应用程序,它使用 Ninject(连同 NinjectWebCommon 文件)在很大程度上满足我的依赖注入需求(这是在应用程序启动时完成的);但是,我在同一个解决方案中有一个单独的项目,我想使用内核在运行时解决一些依赖项。如何在这个“其他”项目中访问我的内核?有没有可能?
【问题讨论】:
标签: c# dependency-injection ninject
如何在这个“其他”项目中访问我的内核?
你不应该这样做。只有应用程序的启动路径应该引用容器/内核。这部分称为Composition Root。内核不应该在 Composition Root 之外被引用;这将是服务定位器反模式的应用程序,并会导致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>();
【讨论】: