使用IoC进行生产和测试的最佳方式

时间:2011-11-24 08:02:35

标签: c# unit-testing dependency-injection inversion-of-control

当使用IoC进行依赖注入时,最推荐的用途是构造函数注入(如许多文章所述),我的问题是:
是否更好地使用构造函数参数注入或通过构造函数传递IoC容器以注入所需的类,以及哪些对单元测试更有用?

2 个答案:

答案 0 :(得分:5)

使用构造函数/属性注入更好。当您将IOC容器传递给构造函数时,您不再执行依赖注入和控制反转。您正在执行服务定位器模式。这意味着类不再获取消费者注入的依赖项,但他们尝试尝试获取它们。您也可能将代码绑定到某个特定的DI框架。

答案 1 :(得分:5)

虽然通过构造函数传递容器比使容器作为完整应用程序的单例可访问更好,但它仍然是Service Locator (anti-pattern)的一种形式,不建议使用。{3}}。这有明显的缺点:

  1. 这使您的代码更难以遵循。
  2. Single Responsibility Principle被违反时(因为班级隐藏了它依赖的东西),它变得不那么明显了。
  3. 这使得测试变得非常困难,因为您需要传递已配置的容器,并且需要查看代码以查看测试需要的内容。
  4. 当从每个类中直接从容器中请求实例时,您将禁用IOC容器为您提供的许多功能,因为您不允许容器构建对象图。根据选择的框架,某些生活方式和特征如基于上下文的注入将无法使用。
  5. 您的所有测试都使用容器实例,使您的测试变得复杂,并且您的所有测试都依赖于DI框架,这使得在需要时切换到另一个框架非常昂贵。
  6. 只需将依赖项注入构造函数,而不是*容器本身。

    *此规则的例外情况是此类位于appliation的Composition Root内。在这种情况下,它不被认为是简单定位器模式,因为该类只是infrastructure component