使用ninject的WinForms对话框的最佳实践是什么?

时间:2010-08-16 14:11:11

标签: c# winforms ninject

我尝试使用Ninject创建应用程序。我有一个MainForm和对话框表单进行设置。我应该如何实现这个? MainForm应该有Kernel个实例,然后使用SettingsForm方法创建Get<SettingsForm>()吗?或者MainForm构造函数是否具有SettingsForm实例的参数?

我试过用ninject找到一些WinForm应用程序的例子,但我发现只有一些ASP.NET应用程序在Visual C#2008 express中没用。

1 个答案:

答案 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示例。

如果您:

,那么你不会走错路
  1. 坚持使用构造函数注入,并尽可能避免在实际代码中直接使用内核或容器属性
  2. 不要使用全局内核和/或服务位置
  3. 9月12日更新:这些天肯定会使用Ninject.Extensions.Factory来管理工厂(即上面的大部分代码将在幕后自动生成)

相关问题