IoC DI

DIP設(shè)計原則

  • DIP 依賴倒置原則是一種軟件架構(gòu)設(shè)計的原則
  • IoC控制反轉(zhuǎn)是一種反轉(zhuǎn)流庇配、依賴和接口的方式哗脖,是DIP的具體實現(xiàn)方式唬格。
  • DI依賴注入是IoC控制反轉(zhuǎn)的一種實現(xiàn)方式龙誊,用來反轉(zhuǎn)依賴,是IoC控制反轉(zhuǎn)的具體實現(xiàn)方式春哨。
  • IoC容器是依賴注入的框架荆隘,用來映射依賴、管理對象創(chuàng)建和生命周期赴背,也就是DI框架椰拒。

DIP依賴倒置原則用來轉(zhuǎn)換依賴,即高層模塊不依賴于低層模塊的實現(xiàn)凰荚,低層模塊依賴于高層模塊定義的接口燃观。傳統(tǒng)低層依賴高層實現(xiàn)很明顯的問題是當(dāng)再有低層添加接口的時候,需要重新去修改高層的實現(xiàn)便瑟。遵從依賴倒置原則的設(shè)計缆毁,在添加低層模塊實現(xiàn)時會讓實現(xiàn)去適配接口,無需再修改高層接口代碼胳徽。

低層依賴高層實現(xiàn)
高層接口依賴低層實現(xiàn)

IoC 控制反轉(zhuǎn)

IoC控制反轉(zhuǎn)是DIP依賴倒置原則的一種實現(xiàn)积锅,也就是設(shè)計模式。IoC控制反轉(zhuǎn)為相互依賴的組件提供抽象养盗,將依賴(低層模塊)對象的獲取交給第三方(系統(tǒng))來控制缚陷,因此依賴對象不在被依賴模塊的類中直接通過new來獲取。

簡單來說B類依賴A類往核,原來的思路是在B類中new A使用箫爷,現(xiàn)在為其解耦,不在B類中new A聂儒,而是在其他地方new A在傳給B供B使用虎锚。為什么要這樣做呢?因為A類可能隨時會進(jìn)行修改衩婚,如果在B類中直接new A那就還需要去修改B類窜护。

DI 依賴注入

DI依賴注入就是將new A的實例傳入B類的實現(xiàn)方案,具體可分為:

  • 構(gòu)造函數(shù)注入
  • 屬性注入

構(gòu)造函數(shù)注入是在B類的構(gòu)造函數(shù)中將A類的實例傳入非春,關(guān)鍵在于傳入的位置在B類的構(gòu)造函數(shù)中應(yīng)該如何定義柱徙,如果定義為某個具體的類,就犯了高層依賴于低層的錯誤奇昙。為了規(guī)避這種錯誤护侮,應(yīng)該讓高層依賴于抽象類,讓底層統(tǒng)一繼承這個抽象類储耐。

屬性注入是通過修改B類的屬性羊初,將A傳入B。實現(xiàn)方式與構(gòu)造函數(shù)注入類似什湘,都是中間依賴于一個抽象類长赞。

例如:在沒有IoC的年代里晦攒,Car汽車必須依賴Engine引擎和Wheel輪子才能跑起來,為了處理此種關(guān)系得哆,首先必須人為通過require將輪子和引擎引入勤家,然后通過new實例化,這樣汽車才能跑起來柳恐。

const Engine = require("/engine");
const Wheel = require("/wheel");

let Car = function(){
    this.engine = new Engine();
    this.wheel = new Wheel();
};

Car.prototype.run = function(){
  this.engine.run();
  this.wheel.run();
  console.log("car run");
};

module.exports = Car;

這種做法存在的問題是使用require需要首先知道引擎和輪子的文件位置、文件名稱热幔、exports的對象乐设。一旦引擎的或輪子的文件名稱、所在位置绎巨、exports方式發(fā)生改變近尚,require操作必然會做出相應(yīng)的改變。由于汽車直接依賴于引擎和輪子场勤,如果做單元測試則會發(fā)現(xiàn)mock引擎或輪子是非常困難的戈锻,兩邊的代碼都需要修改。

例如:使用IoC之后進(jìn)行構(gòu)造函數(shù)注入

let Car = function(engine, wheel){
    this.engine = engine;
    this.wheel = wheel;
};

Car.prototype.run = function(){
    this.engine.run();
    this.wheel.run();
    console.log("car run");
};

module.exports = Car;

此時Car無需知道Engine引擎和媳、輪子Wheel的具體位置格遭,由于不采用require的方式因此也無需知道引擎和輪子什么時候?qū)嵗哉{(diào)用run方法跑起來。這種方式去除了引擎和輪子的直接依賴留瞳,引擎和輪子無論叫做什么名字或位于哪里拒迅。重構(gòu)變得輕而易舉。相對汽車做單元測試時她倘,只需要依賴注入一個mock的引擎和輪子對象即可璧微,再也不用去修改引擎和輪子的代碼。

IoC容器

IoC控制反轉(zhuǎn)是解決組件間依賴關(guān)系硬梁、配置和生命周期的設(shè)計模式前硫,IoC因好萊塢名言“Don't call us, we'll call you”(別來叫我我會來叫你的)而被廣泛認(rèn)知。

IoC容器實際上就是一個DI依賴注入的框架荧止,用于簡化工作量屹电,可以將其視為更為高級的工廠。

IoC容器應(yīng)該提供的功能包括

  • 動態(tài)創(chuàng)建罩息、注入依賴對象
  • 管理對象生命周期
  • 映射依賴關(guān)系
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗤详,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瓷炮,更是在濱河造成了極大的恐慌葱色,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娘香,死亡現(xiàn)場離奇詭異苍狰,居然都是意外死亡办龄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門淋昭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俐填,“玉大人,你說我怎么就攤上這事翔忽∮⑷冢” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵歇式,是天一觀的道長驶悟。 經(jīng)常有香客問我,道長材失,這世上最難降的妖魔是什么痕鳍? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮龙巨,結(jié)果婚禮上笼呆,老公的妹妹穿的比我還像新娘。我一直安慰自己旨别,他們只是感情好诗赌,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秸弛,像睡著了一般境肾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胆屿,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天奥喻,我揣著相機(jī)與錄音,去河邊找鬼非迹。 笑死环鲤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的憎兽。 我是一名探鬼主播冷离,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼纯命!你這毒婦竟也來了西剥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亿汞,失蹤者是張志新(化名)和其女友劉穎瞭空,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡咆畏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年南捂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旧找。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡溺健,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钮蛛,到底是詐尸還是另有隱情鞭缭,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布魏颓,位于F島的核電站缚去,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琼开。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一枕荞、第九天 我趴在偏房一處隱蔽的房頂上張望柜候。 院中可真熱鬧,春花似錦躏精、人聲如沸渣刷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辅柴。三九已至,卻和暖如春瞭吃,著一層夾襖步出監(jiān)牢的瞬間碌嘀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工歪架, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留股冗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓和蚪,卻偏偏與公主長得像止状,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子攒霹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

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