iT邦幫忙

8

[學習筆記] 依賴注入(DI)

di
sion 2019-05-18 21:02:1620937 瀏覽
  • 分享至 

  • xImage
  •  

依賴注入 Dependency Injection(DI)

第一次接觸這個名詞時,真的很難從字面意思理解這東西,查了許多資料卻發現越看越混亂,也常常看懂原理卻跟實作連不起來,所以我將它拆分開來解釋並翻譯成白話文。

依賴指的是物件導向中的繼承、實現、擁有等關係。
注入的意思是從外部傳入。

當 A class 有用到 B class 就可以說是 A 對 B 有依賴。
一般使用其他類別時都會實例化 B b = new B()來使用, 如例1
例1

public class A
{
    B b = new B();
    ...
}

而這樣設計有個缺點,就是
當B改動時,A就要跟著改,而這有什麼問題呢?
當有其他C、D也用到B時,要改動的地方就很多了, 如圖一
圖一
https://ithelp.ithome.com.tw/upload/images/20190517/20117695zS4mrnFtUb.png
此種情況就是高度的耦合(依賴),會造成日後程式撰寫的諸多不便,因為牽一髮而動全身啊!!

解決方法
改成將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的傳入值,如圖二
圖二
https://ithelp.ithome.com.tw/upload/images/20190517/201176950C0ToCipgg.png
異動的程式只有B跟Main,解掉A、C、D對B的依賴就是依賴注入的目的

如果將B設計成 interface 或是 abstract,則可以讓所有繼承 B 的類別都能注入,達成更靈活的設計。

而依賴注入的其他方法與衍生問題在這就先不討論

總結

依賴注入是一種方法,而我們使用依賴注入是為了符合程式設計的原則
,符合程式設計的原則是為了日後維護的便利。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
argyle
iT邦新手 4 級 ‧ 2022-08-24 12:17:38

感謝解說。簡捷明暸。大讚!

我要留言

立即登入留言