代码之家  ›  专栏  ›  技术社区  ›  user1333

在WinForms中使用IOC时如何不绕过容器

  •  7
  • user1333  · 技术社区  · 16 年前

    我是国际奥委会的新手,在WinForms应用程序中实现它时遇到了问题。我有一个非常基本的应用程序WinForm应用程序,它使用MVC,它是一个完成所有工作的控制器和一个工作对话框(显然是用一个控制器)。因此,我将所有类加载到program.cs中的ioc容器中,并使用容器创建主窗体控制器。但这正是我遇到问题的地方,我只想在使用对话控制器时在using语句中创建它。

    起初,我在容器中通过了,但我已经阅读了这是一个糟糕的实践,容器上的更多内容是静态的,我想对这个类进行单元测试。

    那么,如何在不传入容器的情况下以单元测试友好的方式创建类,我考虑的是抽象工厂模式,但仅此一种模式就可以在不使用IOC的情况下解决我的问题。

    我没有使用任何著名的框架,我从这篇博文中借用了一个基本的框架。 http://www.kenegozi.com/Blog/2008/01/17/its-my-turn-to-build-an-ioc-container-in-15-minutes-and-33-lines.aspx

    我该如何与国际奥委会合作?这是国际奥委会的错误用法吗?

    3 回复  |  直到 16 年前
        1
  •  7
  •   Nicholas Blumhardt    16 年前

    Ken的文章很有趣,但是你现在应该了解更多关于“生产”IOC容器的知识,因为现在有一些人支持这个场景。

    例如,在autopac中,可以将工厂“生成”为委托:

    builder.RegisterGeneratedFactory<Func<IDialogController>>();
    

    然后以你的主要形式:

    class MainForm ... {
    
      Func<IDialogController> _controllerFactory;
    
      public MainForm(Func<IDialogController> controllerFactory) { ... }
    
      void ShowDialog() {
        using (var controller = _controllerFactory())
        {
        }
      }
    

    autopac将在运行时填写controllerFactory构造函数参数。在单元测试中,您可以很容易地为构造函数提供lambda。

        2
  •  1
  •   TrueWill    16 年前

    我通常只是将一个接口传递给一个工厂类。

        3
  •  1
  •   Tomas Pajonk    16 年前

    我提出的唯一合理的解决办法是把你的集装箱做成单件。国际奥委会的一些框架为您提供了这样的服务,但是您可能需要自己实现singleton。看看乔恩·斯基特的 ideas .

    祝MVC在WinForms中好运。这是一个陡峭的学习曲线,我才刚刚开始上升。