日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手教你写DI_0_DI是什么?

發(fā)布時(shí)間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你写DI_0_DI是什么? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

DI是什么?

Dependency Injection 常常簡稱為:DI。

它是實(shí)現(xiàn)控制反轉(zhuǎn)(Inversion of Control – IoC)的一個(gè)模式。

fowler 大大大神 “幾十年”前的經(jīng)典文章?https://www.martinfowler.com/articles/injection.html?說的很清楚。

“幾十年”以來,相信大家都早已學(xué)會了 大大大神 的教典。

我們簡單回憶一下對應(yīng)內(nèi)容,以便我們可以順利進(jìn)入后續(xù)章節(jié):徒手?jǐn)]個(gè)小DI。

文章內(nèi)容大致是這樣:

首先舉例:

然后大大大神吐槽了一堆:

這個(gè)實(shí)現(xiàn)類的名字就說明:我將要從一個(gè)逗號分隔的文本文件中獲得影片列表。你不必操心具體的實(shí)現(xiàn)細(xì)節(jié),只要設(shè)想這樣一個(gè)實(shí)現(xiàn)類就可以了。如果這個(gè)類只由我自己使用,一切都沒問題。但是,如果我的朋友嘆服于這個(gè)精彩的功能,也想使用我的程序,那又會怎么樣呢?如果他們也把影片清單保存在一個(gè)逗號分隔的文本文件中,并且也把這個(gè)文件命名為” movie1.txt “,那么一切還是沒問題。如果他們只是給這個(gè)文件改改名,我也可以從一個(gè)配置文件獲得文件名,這也很容易。但是,如果他們用完全不同的方式——例如SQL 數(shù)據(jù)庫、XML 文件、web service,或者另一種格式的文本文件——來存儲影片清單呢?在這種情況下,我們需要用另一個(gè)類來獲取數(shù)據(jù)。由于已經(jīng)定義了MovieFinder接口,我可以不用修改moviesDirectedBy方法。但是,我仍然需要通過某種途徑獲得合適的MovieFinder實(shí)現(xiàn)類的實(shí)例。

還有張依賴圖

MovieLister類既依賴于MovieFinder接口,也依賴于具體的實(shí)現(xiàn)類。我們當(dāng)然希望MovieLister類只依賴于接口,但我們要如何獲得一個(gè)MovieFinder子類的實(shí)例呢?

在Patterns of Enterprise Application Architecture一書中,我們把這種情況稱為插件(plugin):MovieFinder的實(shí)現(xiàn)類不是在編譯期連入程序之中的,因?yàn)槲也⒉恢牢业呐笥褧褂媚膫€(gè)實(shí)現(xiàn)類。我們希望MovieLister類能夠與MovieFinder的任何實(shí)現(xiàn)類配合工作,并且允許在運(yùn)行期插入具體的實(shí)現(xiàn)類,插入動作完全脫離我(原作者)的控制。這里的問題就是:如何設(shè)計(jì)這個(gè)連接過程,使MovieLister類在不知道實(shí)現(xiàn)類細(xì)節(jié)的前提下與其實(shí)例協(xié)同工作。

將這個(gè)例子推而廣之,在一個(gè)真實(shí)的系統(tǒng)中,我們可能有數(shù)十個(gè)服務(wù)和組件。在任何時(shí)候,我們總可以對使用組件的情形加以抽象,通過接口與具體的組件交流(如果組件并沒有設(shè)計(jì)一個(gè)接口,也可以通過適配器與之交流)。但是,如果我們希望以不同的方式部署這個(gè)系統(tǒng),就需要用插件機(jī)制來處理服務(wù)之間的交互過程,這樣我們才可能在不同的部署方案中使用不同的實(shí)現(xiàn)。所以,現(xiàn)在的核心問題就是:如何將這些插件組合成一個(gè)應(yīng)用程序?這正是新生的輕量級容器所面臨的主要問題,而它們解決這個(gè)問題的手段無一例外地是控制反轉(zhuǎn)(Inversion of Control)模式。

學(xué)術(shù)一點(diǎn)就是說 避免類之間強(qiáng)耦合,我們需要用依賴注入等方式在運(yùn)行時(shí)才建立依賴達(dá)到代碼松耦合,從而使代碼易為維護(hù)

戲言就是在說:

  • 我們都是大忙人,請你作為一個(gè)類簡單明了的說清楚 : 你這個(gè)類能干什么事? 不要讓我們這些大忙人把你每件衣服一件一件看完了才知道你是木匠, 還是鐵匠

  • 我們都是大老板,我們財(cái)產(chǎn)不能全靠你一個(gè),你不能干活或者你干不好活,我們做老板的人必須能找人換了你

  • 所以上述代碼中:

    我(MovieLister)離不開了 你 (ColonDelimitedMovieFinder("movies1.txt")),

    但是我們男人必須靠自己,至少表面沒人看出我們之間的關(guān)系

    只有從我們(MovieLister)身體里面沒有了你,才能沒人看出我們之間的關(guān)系

    當(dāng)我們開始干活的時(shí)候,我們再根據(jù)我們的私下關(guān)系協(xié)調(diào)好工作,男女搭配,好好干活。

    說到這里, 各位要被面試的同學(xué)記好這些話, 不要被問到依賴注入幫我解決了什么事情的時(shí)候, 回一句 我們不用自己new 對象啦, 這樣大家就不會看見面試官無語又懵逼的臉了。

    依賴注入的幾種形式

    這幾種方式之間并沒有性能或者什么特別的優(yōu)勢,主要是形式上的差異。

    具體對比可以參考?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社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

    總結(jié)

    以上是生活随笔為你收集整理的手把手教你写DI_0_DI是什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。