C# 在Ninject允许将IKernel注射到某些地方吗?

C# 在Ninject允许将IKernel注射到某些地方吗?,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,我目前正在学习Ninject和依赖注入,在我目前的设置中,我将IKernel传递到其他地方,以便其他类可以实例化某些类或获取工厂实例 目前,我已经将我的工厂绑定为单例,并将IKernel传递到一个对象中,然后执行\u kernel.Get()。CreateSomething()似乎有点代码味道,只是将Ninject变成了一个美化的服务定位器 此外,我的工厂正在通过IKernel,以便它们能够解析它们创建的相应接口的绑定实现 我的问题是: 工厂以这种方式运行是允许的,还是应该简单地实例化具体类型本

我目前正在学习Ninject和依赖注入,在我目前的设置中,我将IKernel传递到其他地方,以便其他类可以实例化某些类或获取工厂实例

目前,我已经将我的工厂绑定为单例,并将IKernel传递到一个对象中,然后执行
\u kernel.Get()。CreateSomething()
似乎有点代码味道,只是将Ninject变成了一个美化的服务定位器

此外,我的工厂正在通过IKernel,以便它们能够解析它们创建的相应接口的绑定实现

我的问题是:

  • 工厂以这种方式运行是允许的,还是应该简单地实例化具体类型本身

  • 我不应该让IKernel到处通行,而是应该让工厂/其他服务通过建造商


  • 我宁愿不。。但那只是我

    而且,我自己的工厂也不生产。。我使用Ninjects工厂扩展。你可以在这里找到它:

    基本上,您可以像普通一样创建绑定,但随后您可以为工厂创建接口(这里假设WinForms):

    Factorys扩展不需要您定义此接口的具体实现。。基于您提供的绑定,它已经知道如何处理这些对象(并且仍然会实例化您尚未定义绑定的任何对象,例如表单。在幕后,它会为您创建一个实现此接口的管理器)

    那么,你可以这样做:

    private readonly IMainFormFactory _factory;
    
    public frmMainForm(IMainFormFactory factory) {
        _factory = factory;
    }
    
    public void btnSettings_Click(object sender, EventArgs e) {
        // show the settings form..
        var settingsForm = _factory.CreateSettingsForm();
        settingsForm.ShowDialog();
    }
    
    ..然后在FRM设置中,它也将注入:

    public frmSettings(ISettingsFormFactory factory) {
        // as above except for ISettingsFactory
    }
    

    …这就是我选择做事的方式。也许其他人有更好的想法(我也很想听听!)。

    我确实看过工厂的扩展,但我不会说谎,我不完全确定它是如何工作的,我还担心它通过nuget(我相信是castle windsor)引入了另一种依赖性,但现在我知道它让我可以简单地使用它了。我对Windsor做了类似的事情-传递Windsor称之为TypedFactory(IIRC)的TypedFactory比传递对容器的引用要好得多。查看并查找service locator反模式:)如果它依赖于Castle项目库,那么它可能是动态代理-许多库(例如模拟框架)都使用它,所以不要为将其作为一个包引入而感到不安。我已经查看了Factorys扩展,通常我会使用它(多么节省时间!)但是我的项目涉及在单独的AppDomain中创建对象,并且工厂类不可序列化/沼泽化,因此我将继续滚动我自己的工厂,这不需要太多工作:)不过谢谢你的回答!
    private readonly IMainFormFactory _factory;
    
    public frmMainForm(IMainFormFactory factory) {
        _factory = factory;
    }
    
    public void btnSettings_Click(object sender, EventArgs e) {
        // show the settings form..
        var settingsForm = _factory.CreateSettingsForm();
        settingsForm.ShowDialog();
    }
    
    public frmSettings(ISettingsFormFactory factory) {
        // as above except for ISettingsFactory
    }