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

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

咱們已經通過依賴注入的方法解決了對象之間的藕合問題,但仍未從根本上解決問題;

下面我們通過容器技術的講解,讓大家明白這種更加合理優秀的解決方案。

容器其實是一個盒子,裡面可以裝任何服務資源:類,類的執行個體,閉包,函數等,不僅可以將被調用者放在裡面,

甚至主調用對象也可以放在裡面。所以容器並不神秘,他和我們日常看到的容器功能是一樣的,就是用來裝東西的。

目前,容器技術已經得到廣泛的應用,眾多的優秀的php開發,都是基於容器技術來實現服務自動載入的。

例如: Laravel, ThinkPHP5.1等等。

容器,也稱服務容器,簡稱(IOC)

基本思想:就是拿來就用,最大限度的簡化外部對象的調用,類似於:[隨插即用]的思想

基本實現分三步:

1.建立容器,將類與類的執行個體化過程綁定到容器中(不局限於類,也可是介面或其它)

2.服務註冊,將可能用到的工具類全部綁定到容器中

3.容器依賴:或者叫依賴容器,調用工作類時直接傳入容器物件即可,工具類的執行個體化由容器完成

下面是實現的源碼:

<?php //資料庫操作類class Db{//資料庫連接public function connect(){return '資料庫連接成功<br>';}}//資料驗證類class Validate{//資料驗證public function check(){return '資料驗證成功<br>';}}//視圖圖class View{//內容輸出public function display(){return '使用者登入成功';}}/******************************************************************************///一.建立容器類class Container{//建立屬性,用空數組初始化,該屬性用來儲存類與類的執行個體化方法protected $instance = [];//初始化執行個體數組,將需要執行個體化的類,與執行個體化的方法進行綁定public function bind($abstract, Closure $process){//鍵名為類名,值為執行個體化的方法$this->instance[$abstract] = $process;}//建立類執行個體public function make($abstract, $params=[]){return call_user_func_array($this->instance[$abstract],[]);}}/******************************************************************************///二、服務綁定: 將類執行個體註冊到容器中$container = new Container(); //將Db類綁定到容器中$container->bind('db', function(){return new Db();});//將Validate類執行個體綁定到容器中$container->bind('validate', function(){return new Validate();});//將View類執行個體綁定到容器中$container->bind('view', function(){return new View();});//測試:查看一下當前容器中的類執行個體// var_dump($container->instance); die;/******************************************************************************///三、容器依賴:將容器物件,以參數的方式注入到當前工作類中//使用者類:工作類class User{//建立三個成員屬性,用來儲存本類所依賴的對象// protected $db = null;// protected $validate = null;// protected $view = '';//這三個與外部對象對應的三個屬性可以全部刪除了,因為它們都已經事先註冊到了容器中//使用者登入操作// public function login(Db $db, Validate $validate, View $view)//此時,只需從外部注入一個容器物件即可,Db,Validate和View執行個體方法全部封裝到了容器中public function login(Container $container){//執行個體化Db類並調用connect()串連資料庫// $db = new Db();// echo $db->connect();echo $container->make('db')->connect();//執行個體化Validate類並調用check()進行資料驗證// $validate = new Validate();// echo $validate->check();echo $container->make('validate')->check();//執行個體化視圖類並調用display()顯示運行結果// $view = new View();echo $container->make('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);//現在工作類中的login方法不需要再像對象依賴注入那樣寫三個對象了,只需要一個容器物件就可以了echo $user->login($container);

其實,容器模式,還可以用外觀設計模式,進一步進行簡化。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注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.