在生产和测试中使用IoC的最佳方式
本文关键字:IoC 最佳 方式 测试 | 更新日期: 2023-09-27 18:15:40
当使用IoC进行依赖注入时,最推荐的使用方法是构造函数注入(正如许多文章所告诉的),我的问题是:
是使用构造函数参数注入更好,还是通过构造函数传递IoC容器注入所需的类更好,哪种方法对单元测试更有用?
尽管通过构造函数传递容器比将容器作为单个实例访问整个应用程序要好,但它仍然是服务定位器(反模式)的一种形式,不推荐使用。这有明显的缺点:
- 它使你的代码更难理解。
- 当单一责任原则被违反时,它使得它不那么明显(因为类隐藏了它所依赖的东西)。
- 这使得测试变得非常困难,因为你需要传递一个配置好的容器,你需要在代码中查看测试需要什么。
- 当直接从每个类中的容器请求实例时,您将禁用IOC容器提供给您的许多特性,因为您不允许容器构建对象图。根据所选择的框架,某些生活方式和功能(如基于上下文的注入)将不可用。
- 你所有的测试都使用一个容器实例,使你的测试变得复杂,而且你所有的测试都依赖于DI框架,这使得在需要时切换到另一个框架的成本非常高。
只需将依赖项注入构造函数中,不要*容器本身。
*当此类位于应用程序的Composition根目录中时,此规则的例外。在这种情况下,它不被认为是简单定位器模式,因为该类只是一个基础设施组件。
使用构造函数/属性注入更好。当您将IOC容器传递给构造函数时,您不再执行依赖项注入和控制反转。您正在执行服务定位器模式。这意味着类不再获得由消费者注入的依赖项,但它们会尝试获取依赖项。您还可能将代码绑定到某些特定的DI框架。