聊聊架構開發的依賴注入,容器與面板模式(上部)

來源:互聯網
上載者:User
這篇文章主要介紹了關於聊聊架構開發的依賴注入,容器與面板模式(上部),有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

一、依賴注入與解藕

熱戀中的男女,經常會說,離開你,我就活不下去了,這是多麼深的依賴呀~~

編程中的依賴,與我們生活中的依賴,本質是一樣的:我的工作,離不開你的支援,沒有你,就沒有我。

依賴有二種: 一是功能上,二是順序上的,下面我們用執行個體來進行說明:

我們現在有這樣的一個任務:

使用者登入操作

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!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.