Ninject for winforms - 我的架构是否使这无用?

Tom*_*m W 6 dependency-injection ninject winforms

我在.net 4中尝试使用winforms应用程序(基本上是草图,我使用它有点像kata,但没有那么严格或具体)的Ninject.

要创建主窗体,我正在执行以下操作:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        [...]
        IKernel kernel = BuildKernel();
        Application.Run(kernel.Get<frmMain>());
    }

    static IKernel BuildKernel()
    {
        var modules = new INinjectModule[] 
        { 
            [..modules]
        };

        return new StandardKernel(modules);
    }
}
Run Code Online (Sandbox Code Playgroud)

精细.这将创建一个主窗体并很好地显示它,将适当的接口实现传递给注入的构造函数.

怎么办?我的应用程序是一个MDI,将有几个子窗口用于操作应用程序模型.我不再有对内核的引用了,所以我应该如何处理Get()这些形式?显而易见的答案是"我将内核传递给表单",但这是一个非常混乱的策略,我确信这不符合DI的理念.

我将在此指出Ninject 2的文档很糟糕.我能找到的一切都重复了基本的例子,而没有真正解释使用Ninject的DI如何让事情变得更容易.给出的示例标准并不复杂,不足以使编码和创建模块和绑定的麻烦变得有价值.

编辑#1:

在研究了Sam Holder友情提供的链接后,我正在尝试"组合根"方法.我的架构现在强制它使用的所有表单从CompositedForm构造函数语义派生,因此:

    [Inject]
    public CompositingForm(ICompositionRoot CompositionRoot)
    {
        InitializeComponent();
        this.CompositionRoot = CompositionRoot;
    }
    public readonly ICompositionRoot CompositionRoot;

    public CompositingForm() : this(new DummyCompositionRoot()) { }
Run Code Online (Sandbox Code Playgroud)

第二个构造函数是为了Forms Designer的好处,除非你提供一个空的构造函数,否则它是愚蠢的并且无法理解表单标记.现在,使用IKernel.Get<AForm>()will(应该)创建的每个表单都有一个组合根注入其中.

所以,因为我是一个缓慢的学习者 - 现在问题是'这个组成根本应该去做什么'?

Sam*_*der 5

你不能将工厂创建子表单传递给表单构造函数,并且表单使用它来获取它们,然后ninject将在使用get创建表单时连接工厂依赖项吗?

我认为你应该使用DI容器配置应用程序根目录中的所有东西,然后不需要容器,但我真的没有真正使用DI容器,而不是NInject,所以我要继续读了......

这个答案可能有帮助


Tom*_*m W 1

感谢Jo\xc3\xa3o AlmeidaKellabyte我找到了一种或多或少令人满意的方法:

\n\n
    \n
  • 定义一个自定义属性,它公开您关心的任何业务规则;
  • \n
  • 定义一个IInjectionHeuristic识别该属性的实现;
  • \n
  • 使用 aViewModelLocator将模块加载到 ninject 内核中。
  • \n
\n