簡單介紹依賴注入、控制反轉

前言

最近同事問到依賴注入、容器、控制反轉…,搞不懂這些名詞之間的關係

相信大家的經驗應該都一樣
搜尋依賴注入時,常常看到控制反轉一起出現
看完了各路文章,還是感覺似懂非懂
不知道注入了什麼,又反轉了什麼出去…
查著查著,又繃出新名詞容器…眼看著分頁越開越多,但還是理解不能@@

剛好前陣子為了學習Angular花了不少心力理解了一遍
整理了一下自己的學習心得,盡量用比較白話的方式解釋
如果有觀念錯誤也煩請留言指正!

依賴注入或控制反轉要解決的痛點

在學習新知識時,我會習慣先去了解這個知識或技術解決了什麼痛點
再從這個角度去看各路文章,會比較容易能掌握

最根本要解決的目標是:耦合的問題
讓2個不同的東西完全解耦,便於抽換

依賴注入? 控制反轉? 容器?

依賴注入,基本上等同於控制反轉,只是不同名詞表現。就像是英文主動、被動的差別
可能是原本英文在說明這件事時,就產生了這2種名詞
導致中文翻譯過來解釋這件事時,也怕自己理解錯誤,一併都翻譯說明
最後就顯得相當混亂

容器 (Container)

框架本身幫您包裝好的,會自動幫您產生依賴注入所需要的功能
只是要理解與使用依賴注入的話,可以先不用太在意他
只要知道目前框架上怎麼使用、注入您要的功能,就足夠了
除非您現在要開發框架,本身需具備依賴注入的思想
那就要去研究容器怎麼實現了

控制反轉(IoC)

「服務A」為了使用「服務B」,所以會在「服務A」自己裡面new 服務B()來使用
如果今天「服務B」要增加傳入參數,那在所有有new 服務B()的地方通通都要修改

耦合太高!這就是依賴注入要解決的痛點!

即「服務A」自己控制「服務B」
現在反轉出去,由容器幫「服務A」控制「服務B」
我(服務A)不需要管他(服務B)怎麼產生或實現

主詞是「服務A」,「服務A」把控制權交給容器來管理。即「控制反轉」

依賴注入(DI)

當「服務A」需要依賴「服務B」的部份功能來解決事情時,把「服務B」注入進來

主詞是容器,在程式裡寫「服務A」注入「服務B」
編譯後,容器就會知道A依賴B,於是容器就會自動在A注入B。即「依賴注入」

示例

例子建議直接參閱石頭的coding之路/IOC(控制反轉) DI(依賴注入) 深入淺出
這篇舉的例子算是相當淺顯易懂,就不在野人獻曝了

參考資料

知乎/如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
石頭的coding之路/IOC(控制反轉) DI(依賴注入) 深入淺出