依賴注入(DI)和 服務定位器(SL)的基本概念

Yii 是我們后端選用的一個 PHP 開發(fā)框架;框架的一個重要的好處就是幫你做了很多事情,讓你少寫很多代碼,并且看起來清晰,可以讓你更聚焦在你的業(yè)務上。

要用好框架,需要你了解很多概念。依賴注入(Denpdency Injection)和服務定位器(Service Locator)就是兩個重要的基本概念?!禗igpage 深入理解 Yii 2.0》依賴注入和依賴注入容器服務定位器 說得非常清楚。

本文就這兩個概念和 Yii 2.0 實現(xiàn)簡要描述一下。

DIP -> IoC -> DI & SL
傳承關系
DI & SL
  • SOLID;
  • @ Inversion Of Control vs Dependency Injection;
  • Martin Fowler: Inversion of Control Containers and the Dependency Injection pattern; 經典文章,值得讀;
  • Service Locator, Dependency Injection (and Container) and Inversion of Control;
  • DIP:依賴倒置原則(Dependence Inversion Principle)
  • IoC:控制反轉(Inversion of Control)
    IoC 是 DIP 的一種具體思路,DIP 只是一種理念、思想,而 IoC 是一種實現(xiàn) DIP 的方法。
    IoC 的核心是將類(上層)所依賴的單元(下層)的 實例化過程 交由第三方來實現(xiàn)。
    一個簡單的特征,就是類中不對所依賴的單元有諸如 $component = new yii\component\SomeClass() 的實例化語句。
  • DI pattern:依賴注入(Denpdency Injection)
    DI 是 IoC 的一種設計模式,是一種套路,按照 DI 的套路,就可以實現(xiàn) IoC,就能符合 DIP 原則。 DI 的核心是把類所依賴的單元的實例化過程,放到類的外面去實現(xiàn)。
    相對于 IoC,DI 是一個更具象的概念;
  • 在實際行文中,IoC Container 和 DI Container 通常指的都是一回事;

通過配置實現(xiàn)依賴關系的映射

Yii db component

Database connection is often used as an application component and configured in the application configuration like the following(config/main.php):

'components' => [
    'db' => [ 
        'class' => '\yii\db\Connection',
        'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
        'username' => 'root',
        'password' => '',
        'charset' => 'utf8',
    ],
],
  • 'db' 是默認的 database connection;
  • 假如有多個 database connections,在使用非默認鏈接時可以 override getDb() 函數(shù);
Yii 2.0
  • Yii 中是把 Service LocatorDI Container 結合起來用的,Service Locator 是建立在 DI 容器之上的。
  • Service Locator
    類名、別名、接口名;
  • 通過 config/main.php 文件來配置 Service Locator 映射關系;
  • 注入:構造函數(shù)注入和屬性注入;
  • Yii 2.0 大多是屬性注入;
  • 注冊(register | set)和 解析(resolve | get)
  • DI 容器解析依賴獲取實例的過程是自動完成的;
    層層依賴(依賴嵌套)自動遞歸完成;
  • 入口腳本 index.php require Yii.php:Yii::$container = new yii\di\Container;
  • 入口腳本 index.php 的 $application 是一個 Service Locator;
    yii\web\Application => yii\base\Application => yii\base\Module => yii\di\ServiceLocator
  • 你常使用的 Yii::$app,就是入口腳本 index.php 的 $application;
    yii\base\Application::__construct() 中實現(xiàn) Yii::$app = $this;
DI 容器解析依賴獲取實例的過程示意圖
DI容器解析依賴獲取實例的過程示意圖(用心制作的一張圖?。?/div>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容