服務(wù)定位器、依賴注入容器(一)

在Yii2中廣泛的用到了這兩個設(shè)計模式加矛,但是這兩個設(shè)計模式不那么容易理解履婉,特別是看到這么一大堆名詞:Servicelocator(服務(wù)定位器)、Dependency Injection(依賴注入)斟览、Dependency Injection Container (依賴注入容器)毁腿、 Dependence Inversion Principle(DIP,依賴倒置原則)苛茂、Inversion of Control(IoC已烤,控制反轉(zhuǎn))、IoC Container(控制反轉(zhuǎn)容器)等味悄。在我第一次看到這些概念的時候草戈,頭都大了!J躺唐片!居然還有這么復(fù)雜的計算機語言?本著一不怕苦涨颜、二不怕死的革命精神费韭,我硬著頭皮把這些概念挨個梳理了一遍,在此分享給大家庭瑰。

首先星持,讓我們先忘掉后三個。因為DIP和IoC是目標(biāo)弹灭,歸根結(jié)底與設(shè)計模式提出的那些設(shè)計原則沒沖突督暂;IoC Container和依賴注入容器有點一致揪垄,Yii2里邊也沒專門說IoC容器的事。然后逻翁,我們再看一下剩下三個中的后兩個饥努,DI是解決問題的思想,DIC是方法八回,也可以合并起來酷愧。本著實干精神,我們就重點來看服務(wù)定位器和依賴注入容器缠诅。

服務(wù)定位器

先推薦兩篇文章溶浴,一篇是Yii2官網(wǎng)的http://www.yiiframework.com/doc-2.0/guide-concept-service-locator.html,另一篇是深入理解Yii2.0 http://www.digpage.com/service_locator.html管引。這兩篇文章里都很好的講了Yii2中如何使用ServiceLocator士败。如果你稍微有一點Yii的開發(fā)經(jīng)驗,你肯定知道在任意地方用一些組件汉匙,如數(shù)據(jù)庫拱烁、緩存、session噩翠、request等的時候戏自,的時候,只需要這樣

$db = Yii->$app->db;
$cache = Yii->$app->cache;
$session = Yii->$app->session;
$request = Yii->$app->request;

Yii->$app就是Yii中最大的ServiceLocator伤锚。服務(wù)定位器擅笔,顧名思義就是能找到服務(wù)的東西,要數(shù)據(jù)庫服務(wù)屯援、緩存服務(wù)猛们、吧啦吧啦,你就去找它狞洋。服務(wù)定位器有這么兩個特點:1弯淘、其中的所有服務(wù)都是單例,這是為了確保軟件的一致性吉懊。2庐橙、服務(wù)能夠更新,這保證了軟件的靈活借嗽,即實現(xiàn)了控制反轉(zhuǎn)态鳖、依賴倒置什么的。
其實恶导,如果你只是用Yii來開發(fā)浆竭,對服務(wù)定位器了解到這里完全足夠了。會用就行,了解那么多干什么邦泄?但是假如你想更明白一些删窒,稍微提高一下自己的水平,那么就再繼續(xù)聽我說一段顺囊。我YY一下這個設(shè)計模式的演化過程易稠。拿訪問數(shù)據(jù)庫為例,最初每當(dāng)我們訪問的時候包蓝,就會創(chuàng)建一個數(shù)據(jù)庫連接。這樣做很直觀企量,但是很費勁测萎,人很累,機器也很累(創(chuàng)建啊届巩、銷毀肮枨啤),還特別容易導(dǎo)致出問題(寫錯參數(shù)恕汇、內(nèi)存滿了)腕唧。一種可能的方法就是在程序啟動的時候,創(chuàng)建一個數(shù)據(jù)庫連接瘾英,然后保證這個對象一直能被訪問到枣接。有點像服務(wù)定位器了。區(qū)別在于這里只有一個服務(wù)缺谴、沒有管理器但惶。這樣其實也還罷了,有點像面向過程的編碼方式湿蛔。并且膀曾,這里是會實際上創(chuàng)建一個服務(wù)。也就是說阳啥,不管你以后會不會用到數(shù)據(jù)庫添谊,都會創(chuàng)建一個數(shù)據(jù)庫連接〔斐伲看出來問題了吧斩狱。下一步,就讓我們看看服務(wù)定位器如何解決這個問題卷拘。在程序啟動時(通常是這樣)喊废,將可能用到的各種服務(wù)的創(chuàng)建方法都告訴服務(wù)定位器,所做的事情相當(dāng)于讀取一個配置表栗弟,這相比創(chuàng)建對象來說污筷,開銷特別少,所以這也是Yii運行非常快的一個主要原因瓣蛀。在程序運行時陆蟆,需要服務(wù)就去找定位器,如果是第一次訪問惋增,則真正創(chuàng)建對象叠殷,并且把對象保存起來,以便以后再用诈皿。需要更新服務(wù)林束,也是直接更新定位器的屬性即可』鳎可是壶冒,如果我們仔細(xì)想想,作為一個類似全局變量的Yii截歉,也存在一定的問題胖腾。這也是服務(wù)定位器的錯誤難追蹤的根本原因。用一個示意圖來顯示一下進化過程瘪松,希望能更有助于理解咸作。

今天就先聊到這里。想看依賴注入容器如何宵睦,且聽下回分解记罚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壳嚎,隨后出現(xiàn)的幾起案子毫胜,更是在濱河造成了極大的恐慌,老刑警劉巖诬辈,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酵使,死亡現(xiàn)場離奇詭異,居然都是意外死亡焙糟,警方通過查閱死者的電腦和手機口渔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穿撮,“玉大人缺脉,你說我怎么就攤上這事≡么” “怎么了攻礼?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長栗柒。 經(jīng)常有香客問我礁扮,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任太伊,我火速辦了婚禮雇锡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僚焦。我一直安慰自己锰提,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布芳悲。 她就那樣靜靜地躺著立肘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪名扛。 梳的紋絲不亂的頭發(fā)上赛不,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音罢洲,去河邊找鬼。 笑死文黎,一個胖子當(dāng)著我的面吹牛惹苗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耸峭,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼桩蓉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劳闹?” 一聲冷哼從身側(cè)響起院究,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎本涕,沒想到半個月后业汰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡菩颖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年样漆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晦闰。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡放祟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呻右,到底是詐尸還是另有隱情跪妥,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布声滥,位于F島的核電站眉撵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜执桌,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一鄙皇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仰挣,春花似錦伴逸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颓芭,卻和暖如春顷锰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亡问。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工官紫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人州藕。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓束世,卻偏偏與公主長得像,于是被迫代替她去往敵國和親床玻。 傳聞我的和親對象是個殘疾皇子毁涉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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