假設一個傳統的類和方法的結構像下面單元測試和依賴注入深度嵌套依賴
public class Foo
{
public void Frob(int a, int b)
{
if (a == 1)
{
if (b == 1)
{
// does something
}
else
{
if (b == 2)
{
Bar bar = new Bar();
bar.Blah(a, b);
}
}
}
else
{
// does something
}
}
}
public class Bar
{
public void Blah(int a, int b)
{
if (a == 0)
{
// does something
}
else
{
if (b == 0)
{
// does something
}
else
{
Baz baz = new Baz();
baz.Save(a, b);
}
}
}
}
public class Baz
{
public void Save(int a, int b)
{
// saves data to file, database, whatever
}
}
然後承擔管理髮出含糊不清的任務,因爲我們做的每一個新事物進行單元測試,是它的一個添加功能,修改要求或錯誤修復。
我可能是字面解釋的堅持者,但我認爲「單元測試」這個詞意味着什麼。例如,這並不意味着給定1和2的輸入,即Foo.Frob
的單元測試只有在將1和2保存到數據庫時纔會成功。基於我讀過的內容,我相信它最終意味着基於1和2的輸入,Frob
被調用Bar.Blah
。 Bar.Blah
是否做了它應該做的事情並不是我的直接擔憂。如果我關心測試整個過程,我相信還有另一個術語,對吧?功能測試?情景測試?隨你。請糾正我,如果我太僵硬,請!
與我的時刻嚴格解釋堅持,讓我們假設我想嘗試使用依賴注入,有一個好處是,我可以嘲笑了我的班,這樣我可以,例如,不堅持我的測試數據到數據庫或文件或任何情況下。在這種情況下,Foo.Frob
需要IBar
,IBar
需要IBaz
,IBaz
可能需要數據庫。這些依賴關係在哪裏被注入?分成Foo
?或者Foo
只需要IBar
,然後Foo
負責創建IBaz
的實例?
當你進入像這樣的嵌套結構時,可以很快看到可能存在多個必需的依賴關係。執行此類注射的首選或可接受的方法是什麼?
+1 - 對於深度嵌套的依賴關係,我相信IoC/DI Container框架通常是一個很好的解決方案。請參閱http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC。aspx – TrueWill 2010-11-10 17:50:25