【问题标题】:How can I access the Ninject kernel from a separate c# project?如何从单独的 c# 项目访问 Ninject 内核?
【发布时间】:2014-04-19 16:37:07
【问题描述】:

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

【问题讨论】:

    标签: c# dependency-injection ninject


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我使用了新的 Ninject.Extensions.Factory 库来帮助我完成您在上面手动编写的内容。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多