依赖注入-如何从一个单独的c#项目访问Ninject内核

本文关键字:单独 一个 项目 内核 Ninject 访问 注入 依赖 | 更新日期: 2023-09-27 17:59:01

我有一个WCF应用程序,它使用Ninject(以及NinjectWebCommon文件)在很大程度上满足我的依赖项注入需求(这是在应用程序启动时完成的);然而,我在同一个解决方案中有一个单独的项目,我想在运行时使用内核来解决一些依赖关系。如何在这个"其他"项目中访问我的内核?这可能吗?

依赖注入-如何从一个单独的c#项目访问Ninject内核

如何在这个"其他"项目中访问我的内核?

你不应该这样做。只有应用程序的启动路径应该引用容器/内核。这部分被称为合成根。内核不应该在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>();