手把手教你写DI_0_DI是什么?
DI是什么?
Dependency Injection 常常簡稱為:DI。
它是實現控制反轉(Inversion of Control – IoC)的一個模式。
fowler 大大大神 “幾十年”前的經典文章?https://www.martinfowler.com/articles/injection.html?說的很清楚。
“幾十年”以來,相信大家都早已學會了 大大大神 的教典。
我們簡單回憶一下對應內容,以便我們可以順利進入后續章節:徒手擼個小DI。
文章內容大致是這樣:
首先舉例:
然后大大大神吐槽了一堆:
這個實現類的名字就說明:我將要從一個逗號分隔的文本文件中獲得影片列表。你不必操心具體的實現細節,只要設想這樣一個實現類就可以了。如果這個類只由我自己使用,一切都沒問題。但是,如果我的朋友嘆服于這個精彩的功能,也想使用我的程序,那又會怎么樣呢?如果他們也把影片清單保存在一個逗號分隔的文本文件中,并且也把這個文件命名為” movie1.txt “,那么一切還是沒問題。如果他們只是給這個文件改改名,我也可以從一個配置文件獲得文件名,這也很容易。但是,如果他們用完全不同的方式——例如SQL 數據庫、XML 文件、web service,或者另一種格式的文本文件——來存儲影片清單呢?在這種情況下,我們需要用另一個類來獲取數據。由于已經定義了MovieFinder接口,我可以不用修改moviesDirectedBy方法。但是,我仍然需要通過某種途徑獲得合適的MovieFinder實現類的實例。
還有張依賴圖
MovieLister類既依賴于MovieFinder接口,也依賴于具體的實現類。我們當然希望MovieLister類只依賴于接口,但我們要如何獲得一個MovieFinder子類的實例呢?
在Patterns of Enterprise Application Architecture一書中,我們把這種情況稱為插件(plugin):MovieFinder的實現類不是在編譯期連入程序之中的,因為我并不知道我的朋友會使用哪個實現類。我們希望MovieLister類能夠與MovieFinder的任何實現類配合工作,并且允許在運行期插入具體的實現類,插入動作完全脫離我(原作者)的控制。這里的問題就是:如何設計這個連接過程,使MovieLister類在不知道實現類細節的前提下與其實例協同工作。
將這個例子推而廣之,在一個真實的系統中,我們可能有數十個服務和組件。在任何時候,我們總可以對使用組件的情形加以抽象,通過接口與具體的組件交流(如果組件并沒有設計一個接口,也可以通過適配器與之交流)。但是,如果我們希望以不同的方式部署這個系統,就需要用插件機制來處理服務之間的交互過程,這樣我們才可能在不同的部署方案中使用不同的實現。所以,現在的核心問題就是:如何將這些插件組合成一個應用程序?這正是新生的輕量級容器所面臨的主要問題,而它們解決這個問題的手段無一例外地是控制反轉(Inversion of Control)模式。
學術一點就是說 避免類之間強耦合,我們需要用依賴注入等方式在運行時才建立依賴達到代碼松耦合,從而使代碼易為維護
戲言就是在說:
我們都是大忙人,請你作為一個類簡單明了的說清楚 : 你這個類能干什么事? 不要讓我們這些大忙人把你每件衣服一件一件看完了才知道你是木匠, 還是鐵匠
我們都是大老板,我們財產不能全靠你一個,你不能干活或者你干不好活,我們做老板的人必須能找人換了你
所以上述代碼中:
我(MovieLister)離不開了 你 (ColonDelimitedMovieFinder("movies1.txt")),
但是我們男人必須靠自己,至少表面沒人看出我們之間的關系
只有從我們(MovieLister)身體里面沒有了你,才能沒人看出我們之間的關系
當我們開始干活的時候,我們再根據我們的私下關系協調好工作,男女搭配,好好干活。
說到這里, 各位要被面試的同學記好這些話, 不要被問到依賴注入幫我解決了什么事情的時候, 回一句 我們不用自己new 對象啦, 這樣大家就不會看見面試官無語又懵逼的臉了。
依賴注入的幾種形式
這幾種方式之間并沒有性能或者什么特別的優勢,主要是形式上的差異。
具體對比可以參考?http://insights.thoughtworkers.org/injection/
引用參考:
http://insights.thoughtworkers.org/injection/
https://www.martinfowler.com/articles/injection.html
原文地址:?https://www.cnblogs.com/fs7744/p/9919559.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的手把手教你写DI_0_DI是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SmartCode.ETL 这不是先有鸡
- 下一篇: 手把手教你写DI_3_小白徒手支持 Si