【发布时间】:2011-05-07 10:11:43
【问题描述】:
当使用依赖注入时,你会注入哪些依赖?
我之前已经注入了所有的依赖,但是在做TDD的时候发现通常有两种依赖:
- 真正的外部依赖项可能会改变,例如产品存储库
- 那些纯粹是为了可测试性而存在的,例如为可测试性而提取和注入的类的部分行为
一种方法是像这样注入所有依赖项
public ClassWithExternalDependency(IExternalDependency external,
IExtractedForTestabilityDependency internal)
{
// assign dependencies ...
}
但我发现这会导致 DI 注册表中的依赖项膨胀。
另一种方法是像这样隐藏“可测试性依赖”
public ClassWithExternalDependency(IExternalDependency external)
: this (external, new ConcreteClassOfInternalDependency())
{}
internal ClassWithExternalDependency(IExternalDependency external,
IExtractedForTestabilityDependency internal)
{
// assign dependencies ...
}
这是更多的努力,但似乎更有意义。缺点是并非所有对象都在 DI 框架中配置,从而打破了我听说过的“最佳实践”。
您会提倡哪种方法以及为什么?
【问题讨论】: