如何从单独的c#项目访问Ninject内核?

时间:2014-04-18 20:54:44

标签: c# dependency-injection ninject

我有一个使用Ninject的WCF应用程序(以及NinjectWebCommon文件)来处理大部分依赖注入需求(这是在应用程序启动时完成的);但是,我在同一个解决方案中有一个单独的项目,我希望在运行时使用内核来解决某些依赖项。如何在这个"其他"中访问我的内核?项目?它甚至可能吗?

1 个答案:

答案 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>();