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

guy*_*uyl 1 c# unit-testing dependency-injection inversion-of-control

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

Dar*_*rov 5

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


Ste*_*ven 5

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

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

只需将依赖项注入构造函数,而不是容器本身.

*此规则的例外情况是此类位于appliation的Composition Root中.在这种情况下,它不被认为是简单定位器模式,因为该类只是一个基础结构组件.