在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ù)定位器的錯誤難追蹤的根本原因。用一個示意圖來顯示一下進化過程瘪松,希望能更有助于理解咸作。
今天就先聊到這里。想看依賴注入容器如何宵睦,且聽下回分解记罚。