I would make the dependency be at the form-to-form level. You want to have something in between that.
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;
}
}
}
Then you inject a Func<SettingsForm> into your class to remove the direct usage of the container / Kernel from your code (if you're doing inline Get calls all over the place, you're doing Service Location, which is a different thing to DI entirely).
public class ExampleNinjectModule : NinjectModule
{
public override void Load()
{
Bind<Func<SettingsForm>>().ToMethod( context => () => context.Kernel.Get<SettingsForm>() );
}
}
Another approach is to add a Kernel to your constructor args (Ninject automatically resolves it), but that quickly becomes a mess in general.
I tried a quick search for samples, but sadly didnt find anything quickly in the WinForms space. I'd suggest perhaps looking for WPF examples instead.
Bottom line is you wont go far wrong if you:
stick with Constructor Injection, and avoiding direct usage of Kernel or container attributes in your real code as much as possible
Dont use a Global Kernel and/or Service Location
Update Sep 12: These days one would definitely employ Ninject.Extensions.Factory to manage the factory (i.e., most of the code would above would be auto-genned behind the scenes)
发布评论
评论(1)
我将使依赖关系处于表单到表单的级别。你想要介于两者之间的东西。
然后,您将
Func
注入到您的类中,以从代码中删除对容器/内核的直接使用(如果您在整个过程中进行内联Get
调用)地方,你正在做服务定位,这与 DI 完全不同)。另一种方法是向构造函数参数添加一个
Kernel
(Ninject 会自动解析它),但这很快就会变得一团糟。我尝试快速搜索示例,但遗憾的是没有在 WinForms 空间中快速找到任何内容。我建议也许寻找 WPF 示例。
最重要的是,如果您满足以下条件,您就不会犯大错:
更新 Sep 12:这些天一肯定会使用 Ninject.Extensions.Factory 来管理工厂(即上面的大部分代码将在幕后自动生成)
I would make the dependency be at the form-to-form level. You want to have something in between that.
Then you inject a
Func<SettingsForm>
into your class to remove the direct usage of the container / Kernel from your code (if you're doing inlineGet
calls all over the place, you're doing Service Location, which is a different thing to DI entirely).Another approach is to add a
Kernel
to your constructor args (Ninject automatically resolves it), but that quickly becomes a mess in general.I tried a quick search for samples, but sadly didnt find anything quickly in the WinForms space. I'd suggest perhaps looking for WPF examples instead.
Bottom line is you wont go far wrong if you:
Update Sep 12: These days one would definitely employ Ninject.Extensions.Factory to manage the factory (i.e., most of the code would above would be auto-genned behind the scenes)