依赖注入-如何从一个单独的c#项目访问Ninject内核
本文关键字:单独 一个 项目 内核 Ninject 访问 注入 依赖 | 更新日期: 2023-09-27 17:59:01
我有一个WCF应用程序,它使用Ninject(以及NinjectWebCommon文件)在很大程度上满足我的依赖项注入需求(这是在应用程序启动时完成的);然而,我在同一个解决方案中有一个单独的项目,我想在运行时使用内核来解决一些依赖关系。如何在这个"其他"项目中访问我的内核?这可能吗?
如何在这个"其他"项目中访问我的内核?
你不应该这样做。只有应用程序的启动路径应该引用容器/内核。这部分被称为合成根。内核不应该在CompositionRoot之外引用;这将是ServiceLocator反模式的应用程序,并将导致各种可维护性问题。
这里的"诀窍"是在应用程序中定义一个抽象的工厂接口。您可以在组合根目录中实现这个工厂。这将使内核引用只保留在组合根目录中,因此不会导致ServiceLocator反模式。
例如:
// 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>();