Luk*_*rkl 2 c# ninject winforms
我尝试用Ninject创建应用程序.我有一个MainForm用于设置的对话框表单.我应该如何实现这个?应该MainForm有一个Kernel实例,然后SettingsForm用Get<SettingsForm>()方法创建?或者MainForm构造函数应该具有SettingsForm实例参数?
我尝试用ninject找到一些WinForm应用程序的例子,但我发现只有一些ASP.NET应用程序在Visual C#2008 express中没用.
我会依赖于形式到表单的级别.你想要介于两者之间.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你Func<SettingsForm>在你的类中注入一个以从你的代码中删除容器/内核的直接用法(如果你Get在整个地方进行内联调用,你正在进行服务定位,这完全与DI不同).
public class ExampleNinjectModule : NinjectModule
{
public override void Load()
{
Bind<Func<SettingsForm>>().ToMethod( context => () => context.Kernel.Get<SettingsForm>() );
}
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是在Kernel你的构造函数args中添加一个(Ninject会自动解析它),但这很快就会变得一团糟.
我试着快速搜索样本,但遗憾的是在WinForms空间中没有找到任何东西.我建议也许会寻找WPF示例.
最重要的是,如果你:
9月12日更新:这些天肯定会使用Ninject.Extensions.Factory来管理工厂(即,上面的大部分代码将在幕后自动生成)