我尝试使用Ninject创建应用程序。我有一个MainForm
和对话框表单进行设置。我应该如何实现这个? MainForm
应该有Kernel
个实例,然后使用SettingsForm
方法创建Get<SettingsForm>()
吗?或者MainForm
构造函数是否具有SettingsForm
实例的参数?
我试过用ninject找到一些WinForm应用程序的例子,但我发现只有一些ASP.NET应用程序在Visual C#2008 express中没用。
答案 0 :(得分:5)
我会将依赖关系设置为表单到表单级别。你想要介于两者之间。
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<SettingsForm> _createSettingsForm;
public MainForm( Func<SettingsForm> createSettingsForm, SettingsRepository settingsRepository )
{
_createSettingsForm = createSettingsForm;
_settingsRepository = settingsRepository;
}
}
}
然后你在你的课程中注入一个Func<SettingsForm>
来删除代码中容器/内核的直接用法(如果你在整个地方进行内联Get
调用,你正在做服务地点,完全与DI不同。)
public class ExampleNinjectModule : NinjectModule
{
public override void Load()
{
Bind<Func<SettingsForm>>().ToMethod( context => () => context.Kernel.Get<SettingsForm>() );
}
}
另一种方法是在构造函数args中添加Kernel
(Ninject会自动解析它),但这很快就会变得一团糟。
我尝试快速搜索样本,但遗憾的是在WinForms空间中没有找到任何内容。我建议改为寻找WPF示例。
如果您:
,那么你不会走错路9月12日更新:这些天肯定会使用Ninject.Extensions.Factory来管理工厂(即上面的大部分代码将在幕后自动生成)