首页 文章

在Ninject中是否允许将IKernel注入到位?

提问于
浏览
3

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

目前我已经将我的工厂绑定为单例,并将IKernel传递给一个对象,然后做 _kernel.Get<ISomethingFactory>().CreateSomething() 似乎可能有点代码味道,只是将Ninject变成一个美化的服务定位器 .

此外,我的工厂正在传递IKernel,因此他们可以解析他们创建的相应接口的绑定实现 .

我的问题是:

  • 允许工厂以这种方式运行,或工厂是否应该简单地实例化混凝土类型?

  • 我应该支持通过构造函数传递工厂/其他服务,而不是遍布整个地方的IKernel?

1 回答

  • 4

    我不喜欢......但那只是我 .

    另外,我不会推出自己的工厂..我使用Ninjects Factories扩展 . 你可以在这里找到它:

    https://github.com/ninject/ninject.extensions.factory

    基本上,你像平常一样创建绑定,但是然后你为工厂创建接口(在这里假设WinForms):

    public interface IMainFormFactory {
        frmLogin CreateLoginForm();
        frmSettings CreateSettingsForm();
        IRepository<MainFormModel> CreateMainFormRepository();
    }
    

    ..并将其与 ToFactory 扩展名绑定:

    using Ninject.Factories; // can't quite remember namespace at the moment
    
    public class FactoryModule : NinjectModule {
        protected override void Load() {
            Bind<IMainFormFactory>().ToFactory();
        }
    }
    

    工厂扩展不需要你定义这个接口的具体实现..它已经知道如何根据你提供的绑定对这些对象做什么(并且仍然会实例化你没有定义绑定的任何东西..例如窗体 . 在幕后它创建了一个为你实现这个接口的管理器 .

    那么,你可以这样做:

    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();
    }
    

    ..然后在frmSettings中它也会注入:

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

    ..这就是我选择做事的方式 . 也许其他人有更好的想法(我也有兴趣听他们!) .

相关问题