【问题标题】:How to not pass around the container when using IoC in Winforms在 Winforms 中使用 IoC 时如何不绕过容器
【发布时间】:2010-12-18 10:46:07
【问题描述】:

我是 IoC 世界的新手,在 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借了一个基本的框架

我如何使用 IoC 做到这一点?这是对 IoC 的错误使用吗?

【问题讨论】:

    标签: c# .net winforms unit-testing inversion-of-control


    【解决方案1】:

    Ken 的帖子非常有趣,但您现在值得进一步了解“生产”IoC 容器,因为现在有一些支持这种情况。

    例如,在 Autofac 中,您可以“生成”一个工厂作为委托:

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

    然后在你的主要形式中:

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

    Autofac 将在运行时填写 controllerFactory 构造函数参数。在您的单元测试中,您可以轻松地向构造函数提供 lambda。

    【讨论】:

      【解决方案2】:

      我想到的唯一合理的解决方案是让你的容器单例。一些 IoC 框架会为您做到这一点,但您可能必须推出自己的 Singleton 实现。看看 Jon Skeet 的ideas

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

      【讨论】:

      • 我之前在工作中曾尝试在 WinForms 中实现 MVC,但我们最终得到了一个不完全是 MVC 的混合解决方案。这是一场艰苦的斗争。
      • IoC 容器的一个好处是摆脱了单例。生命周期管理由容器处理。如果将容器设为 Singleton,则将所有类都耦合到容器中,并且无法再一眼看到类的依赖关系。
      • 我不太确定我怎么看不到我的类依赖项?我发现在应用程序中没有单个单例非常困难 :) 我知道必须明智地使用单例,但我觉得在某些情况下是合理的,例如 winforms 应用程序(甚至是中等复杂度的应用程序)。你认为那里除了对无处不在的容器充满热情并通过它污染您的代码并拥有一个单例容器之外,还有另一种选择吗?
      • Tomas,看看 Autofac 的“生成工厂”、Castle 的“TypedFactory 设施”或 MEF 的“PartCreator”,所有避免静态/单一容器引用的解决方案。
      • @Nicholas Blumhart 谢谢。我现在正在使用 Ninject,但我会看看这些想法。
      【解决方案3】:

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

      【讨论】:

      • 我想过,但这并不能完全消除对 IoC 的需求
      • @L2Type:IoC/DI 不需要容器库——这就是 IoC。但是,当您的类具有多个依赖项,而这些依赖项本身也具有依赖项时,您会欣赏容器库为您提供的接线。
      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多