我不想……但这只是我。
另外,我不创建自己的工厂。我使用 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();
}
}
工厂扩展不需要你定义这个接口的具体实现。它已经知道如何根据你提供的绑定来处理这些对象(并且仍然会实例化你没有定义绑定的任何东西......例如表单。在幕后,它会为您创建一个实现此接口的管理器)。
那么,您可以执行以下操作:
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
}
..这就是我选择做事的方式。也许其他人有更好的想法(我也有兴趣听到它们!)。