來看一個例子:需要編寫一個類A,其內部需要日志功能;A采用IoC方式,不依賴於具體的Logger類, 由使用者根據需要注入具體的實現;同時,A的使用者B,希望采用第三方的Logger類。
a. 基於接口的IoC
interface ILogger { void Write(string msg); }
class A{
ILogger Logger { get; set; }
void F() {}
}
class B{
G(){
A a = new A();
a.Logger = new LogAdapter(); //注入依賴
a.F();
}
}
//對第3方Logger進行包裝
class LogAdapter : ILogger{
Write(string msg){//這裡調用第3方的Logger類}
}
b. 基於委托的IoC
class A{
Action<string> Logging { get; set; }
void F() {}
}
class B{
G(){
A a = new A();
a.Logging = delegate(string msg){ //調用第3方Logger類 };
a.F();
}
}
比較上面兩個例子,我們就會發現委托比接口的約束要弱得多,使用起來靈活得多。基於接口的實現 不得不增加一個Adapter去機械地適應接口的類型約束,而基於委托的實現只需要保證方法簽名約束即可 。
後續
後續章節打算陸續介紹DuckTyping、泛型委托妙用、表達式樹和lambda、.Net4.0動態編程等相關內容 ,敬請關注,多謝批評!