關於IoC的有趣之處在於,寫入風格的對象通常與這些細節分離。
讓我們使用實用工具類爲例:
public class HttpUtils
{
public static void DoStuff(int someValue)
{
// ...
}
}
在非國際奧委會爲重點的應用程序,你可以直接使用該方法:
public class Foo
{
public int Value { get; set; }
public void DoStuff()
{
HttpUtils.DoStuff(Value);
}
}
然而,夫婦的定義DoStuff
直接執行。國際奧委會致力於離婚的種種細節,所以不是我們定義自身的操作:
public interface IDoesStuff
{
void DoStuff(int someValue);
}
然後,我們離開房間Foo
爲實現改變:
public class Foo
{
private readonly IDoesStuff _doesStuff;
public Foo(IDoesStuff doesStuff)
{
_doesStuff = doesStuff;
}
public int Value { get; set; }
public void DoStuff()
{
_doesStuff.DoStuff(Value);
}
}
這樣可以使Foo
從HttpUtils
。 DoStuff
這個概念的實現者現在是一個配置細節,而不是一個固有的依賴關係(就像靜態方法一樣)。
請注意,Foo
不知道它的IDoesStuff
是否爲單例。該生存期是也是的配置細節,而不是Foo
的固有細節。
總而言之,IoC和static
一般都是不一致的,因爲IoC促進變化,根據定義,static
可以阻止它。在你的構造函數中聲明你的依賴關係,你會發現你幾乎從來沒有使用過static
的功能。
感謝Bryan - 這是否意味着每次都可能會有更多的IOC構造事物(例如記錄器)的開銷?同樣對於utils類型類,我想知道這會不會在重構助手類中的輔助函數時使得重構更難? (我自己使用ReSharper) - 謝謝 – Greg 2010-03-26 21:17:41
大多數IoC容器允許某種範圍的範圍。通過這個,我的意思是說明你的對象是每次(工廠)創建的,每個上下文(工作單元)創建一次,還是每個應用程序(單例)一次。這意味着您可以註冊記錄器,使其僅創建一次。 – 2010-03-26 21:28:05
最終你想消除公用事業類。每個類中的每個方法都與上面的「HttpUtils.DoStuff」方法具有相同的耦合問題。出於這個原因,你不想要求任何*代碼直接依賴於'static'成員。相反,將'HttpUtils.DoStuff'的主體放在'IDoesStuff'後面,並從'HttpUtils'完全刪除該方法。現在,任何可能調用靜態方法的類都可以在其構造函數中接受'IDoesStuff'。維奧拉:不再需要公用事業類! – 2010-03-26 21:37:51