编程语言
首页 > 编程语言> > c#-在Ninject中允许将IKernel注入位置吗?

c#-在Ninject中允许将IKernel注入位置吗?

作者:互联网

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

目前,我将工厂绑定为单例,然后将IKernel传递到对象中然后执行_kernel.Get< ISomethingFactory>().CreateSomething()似乎有点代码气味,并且只是将Ninject变成了荣耀服务定位器.

而且,我的工厂正在传递IKernel,因此它们可以解析所创建的各个接口的绑定实现.

我的问题是:

>工厂是否可以以这种方式运行,还是工厂应该简单地实例化具体类型本身?
>我应该赞成通过构造函数传递工厂/其他服务,而不是在各处传递IKernel?

解决方法:

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

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

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

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

..then也会在frmSettings中注入:

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

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

标签:dependency-injection,ninject,c
来源: https://codeday.me/bug/20191031/1976427.html