這篇文章主要介紹了關於聊聊架構開發的依賴注入,容器與面板模式(上部),有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
一、依賴注入與解藕
熱戀中的男女,經常會說,離開你,我就活不下去了,這是多麼深的依賴呀~~
編程中的依賴,與我們生活中的依賴,本質是一樣的:我的工作,離不開你的支援,沒有你,就沒有我。
依賴有二種: 一是功能上,二是順序上的,下面我們用執行個體來進行說明:
我們現在有這樣的一個任務:
使用者登入操作
1.涉及資料庫操作,資料驗證,模板輸出;
2.分別對應Db類,Validate類,View類;
3.僅做示範,具體執行個體請同學們自行完成;
在正式編碼前,先簡單瞭解一下什麼是用戶端?
1. 用戶端:只要能發起請求,都可以看作用戶端,瀏覽器,一段代碼都可以
2. 以下的代碼,在執行個體化User類,並調用其內部的loign方法進行工作
3. 所以,$user = new User();就是用戶端代碼
4. 或者,也可以這樣理解,凡寫在類或函數等代碼之外的,都可看作用戶端
源碼如下:
<?php //資料庫操作類class Db{//資料庫連接public function connect(){return '資料庫連接成功<br>';}}//資料驗證類class Validate{//資料驗證public function check(){return '資料驗證成功<br>';}}//視圖圖class View{//內容輸出public function display(){return '使用者登入成功';}}//使用者類class User{//使用者登入操作public function login(){//執行個體化Db類並調用connect()串連資料庫$db = new Db();echo $db->connect();//執行個體化Validate類並調用check()進行資料驗證$validate = new Validate();echo $validate->check();//執行個體化視圖類並調用display()顯示運行結果$view = new View();echo $view->display();}}//建立User類$user = new User();//調用User對象的login方法進行登入操作echo $user->login();
以上代碼儘管可以正常工作,但仍存在以下問題:
1. 以上的四個類,只有User是實際工作類,其它三個都是工具類(Db,Validate,View)
2. 工作類中調用的工具類一旦發生變化,必須修改對這些工具類的所有引用代碼,例如Db參數變化
3. 工作類的調用者必須對要用到的所有工具類,非常熟悉,對參數與傳回值必須瞭解
4. 工作類對以上三個工具類,形成了嚴重的依賴,也叫類之間嚴重耦合
下面我們通過最常用的依賴注入(DI)來解藕
我們先瞭解一下解藕的基本思路:
1.依賴注入並不神性
2.本質上來說,就是對工具類的執行個體化不在工作類中完成,而是在工作類之外,即用戶端完成
3.由於工具類執行個體化在用戶端完成,所在在工作類中,必須要有接收器用來儲存執行個體化的工具對象
4.此時,使用者就可以將在用戶端已經執行個體化好的工具對象,以參數的方式直接傳遞給工作類的方法
5.這種由外部直接將對象傳入到當前工作類的方式,就叫依賴注入
源碼如下:
<?php//資料庫操作類class Db{//資料庫連接public function connect(){return '資料庫連接成功<br>';}}//資料驗證類class Validate{//資料驗證public function check(){return '資料驗證成功<br>';}}//視圖圖class View{//內容輸出public function display(){return '使用者登入成功';}}//使用者類class User{//建立三個成員屬性,用來儲存本類所依賴的對象protected $db = null;protected $validate = null;protected $view = '';//使用者登入操作public function login(Db $db, Validate $validate, View $view){//執行個體化Db類並調用connect()串連資料庫// $db = new Db();echo $db->connect();//執行個體化Validate類並調用check()進行資料驗證// $validate = new Validate();echo $validate->check();//執行個體化視圖類並調用display()顯示運行結果// $view = new View();echo $view->display();}}//在用戶端完成工具類的執行個體化(即工具類執行個體化前移)$db = new Db();$validate = new Validate();$view = new View();//建立User類$user = new User();//調用User對象的login方法進行登入操作// echo $user->login();// 將該類依賴的外部對象以參數方式注入到當前方法中,當然,推薦以構造器方式注入最方便echo '<h3>用依賴注入進行解藕:</h3>';echo $user->login($db, $validate, $view);
雖然將依賴類的執行個體化前移到用戶端,但解決了類之間的依賴問題
但是仍存在以下幾個問題:
1.為了使工作類User正常工具,必須事先在外部將所需要的類全部事先執行個體化;
2.只要涉及執行個體化,就要求用戶端(調用者)必須對這些依賴類的細節非常瞭解,例如參數與傳回值
那麼能不能讓使用者把執行個體化依賴類的步驟都省略掉呢?這樣豈不是更好,更簡單
我們調用外部依賴類,只要給一個類名,以及一個建立該類執行個體的方法(構造器)就可以了呢?
即: 我們只給出: 類名, 建立類執行個體的方法,其它一概不管
下面我們通過的"容器技術"來這現這種傻瓜式的的解藕過程
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!