當你使用依賴注入時,你注入哪些依賴關係?我應該注入哪些依賴關係?
我以前注入所有依賴性但這樣做當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