讀後感:分析依賴注入、服務容器的產生
名詞:
依賴注入:依賴Dependency 注入Injection 簡稱DI
控制反轉:反轉Inversion of Control 簡稱IoC
容器:Container
在 Laravel 5 中,IoC 容器改名為服務容器,IoC 容器和服務容器指代同一個東西。
原文地址:Laravel 服務容器例項教程 —— 深入理解控制反轉(IoC)和依賴注入(DI)https://laravelacademy.org/post/769.html
該篇講述瞭如何更高效更合理製造一批超級機器人 superman
以下為個人的理解,儘可能以最簡潔的文字寫下來,由於是初學,有認知錯誤請諒解。
假設我們對生產機器人毫無經驗
起初現有以下三種技能,每種技能都有不同配置,和手機一樣不同的cpu核數記憶體硬碟大小
蠻力 class:Force{ $force力量值 }
飛行 class:Flight{ $speed速度 $holdtime持續飛行時間 }
射擊 class:Shot { $atk傷害值 $range射擊距離 $limit同時多少發 }
最初模式
一個機器人就生產出來了,如果修改技能個數,修改配置,需修改superman類
工廠的誕生
建立一個專門例項技能模組的工廠類,superman只需給工廠需要生產什麼技能,什麼配置的報表,委託工廠類來例項化技能類。
我們只需要給工廠需要的報表
$arr = [
Force =>[101],
Flight =>[ 20m/s,1.5h ]
]
class superman { protected $modules; //技能 pub func __construct($arr) { foreach($arr as $modulename=>$param) { /**Force=>[ 101 ]*/ $module =(new factory)->makeModule ($modulename,$param); $this->modules[] = $module; } } }
class factory{
makeModule(){
//為了不讓與技能無關的類被例項化,須預先記錄可用的技能類
switch
case 'Force'
return new Force(..)
case 'Flight'
return new Flight
...
}
}
改革一
第一代生產線生產效率大大提高。
解除依賴 -
1,superman類對工廠類的依賴(superman的實現取決於工廠的具體實現)。
2,工廠類對技能類的依賴( 技能種類的增加;例項化方式改變;例項化的複雜性增加),工廠要對每個技能類瞭如指掌,每次修改實在是頭疼的事情。
我們需要改變生產模式,尋求降低或者解除耦合度。
解除工廠對技能類實現的依賴 生產指令碼的誕生
首先我不需瞭解每個技能類如何例項化,由技能類提供自身的例項指令碼,打包成一鍵安裝的.exe,我只要滑鼠輕輕一點,所有安裝自動完成。所以不管元件是中國或者外國哪家公司提供的,可以隨時替換更高科技的元件。我們的工廠不負責科技的研發,具體的生產線,只提供各個元件的排程。
'Force.exe'=>function(){ 指令碼 }
解除超人類與工廠的依賴
由超人類呼叫工廠,變成外部呼叫
契約的誕生
矛盾:返回的技能例項能不能正常使用呢?
解決:提供契約
interface moduleInterface{
//介面規範
}
class Force implements moduleInterface{
//實現介面
}
超級工廠- 容器
矛盾:實際我們的事業是維護世界和平,不只是做個機器人生產商,還要宇宙飛船,空間站,火箭。。一整套體系。
解決:和機器人模組一樣,機器人也由外部提供,不管是中國還是外國的哪家公司生產的。
到這裡,我們由只生產機器人,變成可以完成登月計劃的整體框架。
機器人、火箭、衛星、宇宙飛船類似laravel的路由、檢視、模型元件,而機器人的晶片force.exe\flight.exe\shot.exe類似單個元件的服務。
這些元件及元件的服務,由容器排程。
所有元件和服務在容器啟動時都已經提前註冊到容器中。由於依賴注入去了耦合;由於契約,元件可以替換服務。
我們在應用中只需要一行程式碼
$app->make(’ superman’,[‘force’,‘flight’]);
end;