第一次接觸這個名詞時,真的很難從字面意思理解這東西,查了許多資料卻發現越看越混亂,也常常看懂原理卻跟實作連不起來,所以我將它拆分開來解釋並翻譯成白話文。
依賴指的是物件導向中的繼承、實現、擁有等關係。
注入的意思是從外部傳入。
當 A class 有用到 B class 就可以說是 A 對 B 有依賴。
一般使用其他類別時都會實例化 B b = new B()
來使用, 如例1
例1
public class A
{
B b = new B();
...
}
而這樣設計有個缺點,就是
當B改動時,A就要跟著改,而這有什麼問題呢?
當有其他C、D也用到B時,要改動的地方就很多了, 如圖一
圖一
此種情況就是高度的耦合(依賴),會造成日後程式撰寫的諸多不便,因為牽一髮而動全身啊!!
解決方法
改成將B在外部實例化後再傳入A
也就是將B當成參數傳入A,如例2
例2
public class A
{
B b;
//建構元注入
public A(B _b)
{
this.b = _b;
}
//設值注入
public void a(B _b)
{
this.b = _b;
...
}
}
如此改善後,當B改動時,只須跟著改Main中對A、C、D的傳入值,如圖二
圖二
異動的程式只有B跟Main,解掉A、C、D對B的依賴就是依賴注入的目的
如果將B設計成 interface 或是 abstract,則可以讓所有繼承 B 的類別都能注入,達成更靈活的設計。
而依賴注入的其他方法與衍生問題在這就先不討論
依賴注入是一種方法,而我們使用依賴注入是為了符合程式設計的原則
,符合程式設計的原則是為了日後維護的便利。