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

Yii 是我们后端选用的一个 PHP 开发框架;框架的一个重要的好处就是帮你做了很多事情,让你少写很多代码,并且看起来清晰,可以让你更聚焦在你的业务上。

要用好框架,需要你了解很多概念。依赖注入(Denpdency Injection)和服务定位器(Service Locator)就是两个重要的基本概念。《Digpage 深入理解 Yii 2.0》依赖注入和依赖注入容器 和 服务定位器 说得非常清楚。

本文就这两个概念和 Yii 2.0 实现简要描述一下。

DIP -> IoC -> DI & SL
依赖注入(DI)和 服务定位器(SL)的基本概念_第1张图片
传承关系
依赖注入(DI)和 服务定位器(SL)的基本概念_第2张图片
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 是一种实现 DIP 的方法。
    IoC 的核心是将类(上层)所依赖的单元(下层)的 实例化过程 交由第三方来实现。
    一个简单的特征,就是类中不对所依赖的单元有诸如 $component = new yii\component\SomeClass() 的实例化语句。
  • DI pattern:依赖注入(Denpdency Injection)
    DI 是 IoC 的一种设计模式,是一种套路,按照 DI 的套路,就可以实现 IoC,就能符合 DIP 原则。 DI 的核心是把类所依赖的单元的实例化过程,放到类的外面去实现。
    相对于 IoC,DI 是一个更具象的概念;
  • 在实际行文中,IoC Container 和 DI Container 通常指的都是一回事;

通过配置实现依赖关系的映射

依赖注入(DI)和 服务定位器(SL)的基本概念_第3张图片
  • @ Dependency Injection Frameworks - Introduction;
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() 函数;
Yii 2.0
  • Yii 中是把 Service Locator 和 DI Container 结合起来用的,Service Locator 是建立在 DI 容器之上的。
  • Service Locator
    类名、别名、接口名;
  • 通过 config/main.php 文件来配置 Service Locator 映射关系;
  • 注入:构造函数注入和属性注入;
  • 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() 中实现 Yii::$app = $this;
DI 容器解析依赖获取实例的过程示意图
依赖注入(DI)和 服务定位器(SL)的基本概念_第4张图片
DI容器解析依赖获取实例的过程示意图(用心制作的一张图啊)

你可能感兴趣的:(依赖注入(DI)和 服务定位器(SL)的基本概念)