.NET學(xué)習(xí)隨筆(一)

了解依賴注入

依賴注入產(chǎn)生的背景:

隨著面向?qū)ο蠓治雠c設(shè)計(jì)的發(fā)展桦卒,一個良好的設(shè)計(jì)蒋困,核心原則之一就是將變化隔離翻擒,使得變化部分發(fā)生變化時政恍,不變部分不受影響(這也是OCP的目的)汪拥。為了做到這一點(diǎn),要利用面向?qū)ο笾械亩鄳B(tài)性篙耗,使用多態(tài)性后迫筑,客戶類不再直接依賴服務(wù)類,而是依賴于一個抽象的接口宗弯,這樣脯燃,客戶類就不能在內(nèi)部直接實(shí)例化具體的服務(wù)類。但是蒙保,客戶類在運(yùn)作中又客觀需要具體的服務(wù)類提供服務(wù)辕棚,因?yàn)榻涌谑遣荒軐?shí)例化去提供服務(wù)的。就產(chǎn)生了“客戶類不準(zhǔn)實(shí)例化具體服務(wù)類”和“客戶類需要具體服務(wù)類”這樣一對矛盾追他。為了解決這個矛盾坟募,開發(fā)人員提出了一種模式:客戶類定義一個注入點(diǎn)岛蚤,用于服務(wù)類的注入邑狸,而客戶類的客戶類(Program,即測試代碼)負(fù)責(zé)根據(jù)情況涤妒,實(shí)例化服務(wù)類单雾,注入到客戶類中,從而解決了這個矛盾她紫。

依賴注入的正式定義:

依賴注入(Dependency Injection)硅堆,是這樣一個過程:由于某客戶類只依賴于服務(wù)類的一個接口,而不依賴于具體服務(wù)類贿讹,所以客戶類只定義一個注入點(diǎn)渐逃。在程序運(yùn)行過程中,客戶類不直接實(shí)例化具體服務(wù)類實(shí)例民褂,而是客戶類的運(yùn)行上下文環(huán)境或?qū)iT組件負(fù)責(zé)實(shí)例化服務(wù)類茄菊,然后將其注入到客戶類中,保證客戶類的正常運(yùn)行赊堪。

依賴注入的類別

(1)Setter注入

Setter注入(Setter Injection)是指在客戶類中面殖,設(shè)置一個服務(wù)類接口類型的數(shù)據(jù)成員,并設(shè)置一個Set方法作為注入點(diǎn)哭廉,這個Set方法接受一個具體的服務(wù)類實(shí)例為參數(shù)脊僚,并將它賦給服務(wù)類接口類型的數(shù)據(jù)成員。


(2)構(gòu)造注入

在客戶類中遵绰,設(shè)置一個服務(wù)類接口類型的數(shù)據(jù)成員辽幌,并以構(gòu)造函數(shù)為注入點(diǎn)增淹,這個構(gòu)造函數(shù)接受一個具體的服務(wù)類實(shí)例為參數(shù),并將它賦給服務(wù)類接口類型的數(shù)據(jù)成員乌企。

與Setter注入很類似埠通,只是注入點(diǎn)由Setter方法變成了構(gòu)造方法。這里要注意逛犹,由于構(gòu)造注入只能在實(shí)例化客戶類時注入一次端辱,所以一點(diǎn)注入,程序運(yùn)行期間是沒法改變一個客戶類對象內(nèi)的服務(wù)類實(shí)例的虽画。由于構(gòu)造注入和Setter注入的IServiceClass舞蔽,ServiceClassA和ServiceClassB是一樣的,不同的ClientClass類码撰。


(3)依賴獲取

上面提到的注入方式渗柿,都是客戶類被動接受所依賴的服務(wù)類,這也符合“注入”這個詞脖岛。不過還有一種方法朵栖,可以和依賴注入達(dá)到相同的目的,就是依賴獲取柴梆。

依賴獲仍山Α(Dependency Locate)是指在系統(tǒng)中提供一個獲取點(diǎn),客戶類仍然依賴服務(wù)類的接口绍在。當(dāng)客戶類需要服務(wù)類時门扇,從獲取點(diǎn)主動取得指定的服務(wù)類,具體的服務(wù)類類型由獲取點(diǎn)的配置決定偿渡。

可以看到臼寄,這種方法變被動為主動,使得客戶類在需要時主動獲取服務(wù)類溜宽,而將多態(tài)性的實(shí)現(xiàn)封裝到獲取點(diǎn)里面吉拳。獲取點(diǎn)可以有很多種實(shí)現(xiàn),也許最容易想到的就是建立一個Simple Factory作為獲取點(diǎn)适揉,客戶類傳入一個指定字符串留攒,以獲取相應(yīng)服務(wù)類實(shí)例。如果所依賴的服務(wù)類是一系列類涡扼,那么依賴獲取一般利用Abstract Factory模式構(gòu)建獲取點(diǎn)稼跳,然后,將服務(wù)類多態(tài)性轉(zhuǎn)移到工廠的多態(tài)性上吃沪,而工廠的類型依賴一個外部配置汤善,如XML文件。

不過,不論使用Simple Factory還是Abstract Factory红淡,都避免不了判斷服務(wù)類類型或工廠類型不狮,這樣系統(tǒng)中總要有一個地方存在不符合OCP的if…else或switch…case結(jié)構(gòu),這種缺陷是Simple Factory和Abstract Factory以及依賴獲取本身無法消除的在旱,而在某些支持反射的語言中(如C#)摇零,通過將反射機(jī)制的引入徹底解決了這個問題。



? ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桶蝎,一起剝皮案震驚了整個濱河市驻仅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌登渣,老刑警劉巖噪服,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胜茧,居然都是意外死亡粘优,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門呻顽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雹顺,“玉大人,你說我怎么就攤上這事廊遍℃依ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵昧碉,是天一觀的道長英染。 經(jīng)常有香客問我揽惹,道長被饿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任搪搏,我火速辦了婚禮狭握,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疯溺。我一直安慰自己论颅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布囱嫩。 她就那樣靜靜地躺著恃疯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墨闲。 梳的紋絲不亂的頭發(fā)上今妄,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼盾鳞。 笑死犬性,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的腾仅。 我是一名探鬼主播乒裆,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼推励!你這毒婦竟也來了鹤耍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤验辞,失蹤者是張志新(化名)和其女友劉穎惰蜜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體受神,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抛猖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鼻听。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财著。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撑碴,靈堂內(nèi)的尸體忽然破棺而出撑教,到底是詐尸還是另有隱情,我是刑警寧澤醉拓,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布伟姐,位于F島的核電站,受9級特大地震影響亿卤,放射性物質(zhì)發(fā)生泄漏愤兵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一排吴、第九天 我趴在偏房一處隱蔽的房頂上張望秆乳。 院中可真熱鬧,春花似錦钻哩、人聲如沸屹堰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扯键。三九已至,卻和暖如春珊肃,著一層夾襖步出監(jiān)牢的瞬間荣刑,已是汗流浹背扣泊。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘶摊,地道東北人延蟹。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像叶堆,于是被迫代替她去往敵國和親阱飘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 概述 Spring是什么虱颗? Spring是一個開源框架沥匈,為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的,但是現(xiàn)在已經(jīng)不止于企...
    瑯筑閱讀 1,157評論 2 8
  • 作為一個程序員,在找工作的過程中,都會遇到筆試,而很多筆試?yán)锩娑及╦ava,尤其是作為一個Android開發(fā)工程...
    仇諾伊閱讀 7,972評論 15 295
  • 設(shè)計(jì)模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計(jì)原則時需要注意以下幾點(diǎn):a) 高內(nèi)聚忘渔、低耦合和單一職能的“沖突”實(shí)際上高帖,這兩者...
    彥幀閱讀 3,736評論 0 14
  • 簡介 首先明確一下概念: Spring Framework[https://spring.io/projects/...
    Whyn閱讀 424評論 0 0
  • 最近在面試,總結(jié)總結(jié)遇到的面試題. 基礎(chǔ)問題 LRU算法 [內(nèi)存管理]的一種頁面置換算法,對于在內(nèi)存中但又不用的[...
    在牛魔角上狂碼閱讀 1,669評論 0 0