我正在学习Ninject和依赖注入,在我目前的设置中,我将IKernel传递到位,以便其他类可以实例化某些类或获取工厂实例。
目前我已经将我的工厂绑定为单例,并将IKernel传递给一个对象然后执行_kernel.Get<ISomethingFactory>().CreateSomething()
似乎可能有点代码味道,只是将Ninject变成一个美化的服务定位器。 / p>
此外,我的工厂正在传递IKernel,因此他们可以解析他们创建的相应界面的绑定实现。
我的问题是:
工厂是否允许以这种方式运作,或工厂是否应该简单地实例化具体类型?
我应该支持通过构造函数传递工厂/其他服务,而不是遍布整个地方吗?
答案 0 :(得分: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();
}
}
工厂扩展不需要你定义这个接口的具体实现..它已经知道如何根据你提供的绑定对这些对象做什么(并且仍然会实例化你没有定义绑定的任何东西for ..比如表单。在幕后它会创建一个为你实现这个界面的管理器。)
那么,你可以这样做:
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
}
..这就是我选择做事的方式。也许其他人有更好的想法(我也有兴趣听他们!)。