【发布时间】:2012-01-05 10:19:48
【问题描述】:
当使用 IoC 进行依赖注入时,最推荐使用的是构造函数注入(如许多文章所述),我的问题是:
使用构造函数参数注入还是通过构造函数传递IoC容器以注入所需的类更好,什么对单元测试更有用?
【问题讨论】:
标签: c# unit-testing dependency-injection inversion-of-control
当使用 IoC 进行依赖注入时,最推荐使用的是构造函数注入(如许多文章所述),我的问题是:
使用构造函数参数注入还是通过构造函数传递IoC容器以注入所需的类更好,什么对单元测试更有用?
【问题讨论】:
标签: c# unit-testing dependency-injection inversion-of-control
虽然通过构造函数传递容器比让容器作为一个完整应用程序的单例访问要好,但它仍然是Service Locator (anti-pattern)的一种形式,不推荐使用。这有明显的缺点:
只需将依赖项注入到构造函数中,而不是*容器本身。
*此规则的例外是此类位于应用程序的Composition Root 内。在这种情况下,它不被视为简单定位器模式,因为该类只是一个 infrastructure component。
【讨论】:
使用构造函数/属性注入更好。当您将 IOC 容器传递给构造函数时,您不再进行依赖注入和控制反转。您正在执行服务定位器模式。这意味着类不再让消费者注入它们的依赖项,而是试图获取它们。您也可能将您的代码绑定到某个特定的 DI 框架。
【讨论】: