使用ninject的WinForms对话框的最佳实践是什么?
我尝试用Ninject创建应用程序。 我有一个MainForm
和对话框表单进行设置。 我应该如何实现这个? MainForm
应该有一个Kernel
实例,然后使用Get()
方法创建SettingsForm
吗? 或者MainForm
构造函数应该具有SettingsForm
实例的参数?
我尝试用ninject找到一些WinForm应用程序的例子,但我发现只有一些ASP.NET应用程序在Visual C#2008 express中没用。
我会依赖于forms到表单的级别。 你想要介于两者之间。
namespace Example { public class SettingsRepository { public SettingsRepository() { } } public class SettingsForm { private SettingsRepository _settingsRepository; public SettingsForm( SettingsRepository settingsRepository ) { _settingsRepository = settingsRepository; } } public class MainForm { private SettingsRepository _settingsRepository; private Func _createSettingsForm; public MainForm( Func createSettingsForm, SettingsRepository settingsRepository ) { _createSettingsForm = createSettingsForm; _settingsRepository = settingsRepository; } } }
然后你在你的类中注入一个Func
来删除代码中容器/内核的直接用法(如果你在内部进行内联Get
调用,那你就是在做Service Location,这是另一回事完全去DI。
public class ExampleNinjectModule : NinjectModule { public override void Load() { Bind>().ToMethod( context => () => context.Kernel.Get() ); } }
另一种方法是在构造函数args中添加一个Kernel
(Ninject会自动解析它),但这很快就会变得一团糟。
我试着快速搜索样本,但遗憾的是在WinForms空间中没有找到任何东西。 我建议也许会寻找WPF示例。
最重要的是,如果你:
- 坚持使用构造函数注入,并尽可能避免在实际代码中直接使用内核或容器属性
- 不要使用全局内核和/或服务位置
更新9月12日:这些天肯定会使用Ninject.Extensions.Factory来管理工厂(即,上面的大部分代码将在幕后自动生成)