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