当你使用依赖注入时,你注入哪些依赖关系?我应该注入哪些依赖关系?
我以前注入所有依赖性但这样做当TDD已经发现通常有两种类型的相关性:
- 那些其可以例如改变真正外部依赖ProductRepository
- 纯粹为了可测试性而存在的那些例如在已提取并注入只是可测性
一种方法的类的行为的部分原因是注入所有依赖这样
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框架中配置,因此打破了我所听到的“最佳实践”。
你会主张哪种方法,为什么?
反转依赖关系的好处之一是能够单独测试单元。我可能会提取一个计算器类来单独测试它,但也许它不需要注入(参见第二个代码示例)。我无法在原地进行测试,因为它会使计算器课程的客户端的测试膨胀。 – Alex 2011-01-05 20:30:24
注射所有注射剂,新的所有新剂型。如果没有这种区分,DI将要求所有物体在整个程序期间生活。 Newables,又名值类型,表示惰性数据和可选的一些相关的转换行为(即接受值并返回新值的方法)。注射剂,又名服务/业务类型,代表功能和可选的一些相关的程序状态。可以说,我们也有I/O类型来表示外部状态,例如文件()。 I/O类型必须是新的,但应通过抽象工厂创建,以便可以进行模拟测试。 – Jegschemesch 2014-04-17 19:12:53