18. Yii 2.0 依赖注入容器

三层架构:从高到底分别是 用户界面层(UIL)、业务逻辑层(BLL)和 数据访问层(DAL),传统的依赖关系是高层模块直接依赖于低层模块。
区分层次的目的是为了”高内聚、低耦合“的思想。

依赖倒置:高层模块不依赖于低层模块的实现,而是依赖于二者之间的抽象(接口)。

控制反转(Inversion of Control,简称 IoC)
控制反转是一种设计模式,它是工厂模式的升华,可以把 IoC 看作是一个大工厂,只不过这个大工厂里要生成的对象是通过一个配置文件(java中用XML文件,php中用php文件)来定义的,然后利用反射技术,即根据给出的字符串类名来生成相应的对象。IoC 把以前在工厂方法里写死的对象,变为由配置文件来定义,从而把对象和工厂分离开来,提高了工厂模式的灵活性。
控制反转一般分为两种类型,依赖注入和依赖查找。

依赖注入(Dependency Injection,简称 DI
依赖注入是控制反转的一种类型,通过依赖注入,高层模块不再依赖于底层模块,而是依赖于层次外部的程序,从而实现层次间的解耦。

比如:业务逻辑层和数据访问层,按照传统的依赖关系,我们经常会在业务逻辑层直接实例化一个数据库连接对象(如:MySQL),来访问数据库,这种依赖关系的耦合性太高,不便于解耦。假如,我们现在要从MySQL切换到Oracle,就需要修改大量的业务逻辑层的代码。
依赖注入可以解决这个问题,它将需要用到的类放到一个统一的配置文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中。

Yii 2.0 框架的依赖注入核心文件所在的目录为  vendor/yiisoft/yii2/di,核心类文件是 Container.php(容器)即工厂,需要用到某个对象的时候,工厂才会将容器中的类实例化为对象。

这里以 Yii 2.0 基础版为例,介绍如何使用依赖注入。

首先,在项目的组件目录中  /basic/components 创建一个类(比如mysql数据库连接类)Mysql.php,代码如下:

    ';
    }
}
其次,在项目配置目录  /basic/config 中添加一个 container.php 文件,作为依赖关系的配置文件,代码如下:

   set('app\components\Mysql');  

// 使用单例模式,注册依赖关系
// \Yii::$container->setSingleton('app\components\Mysql');

// 注册依赖关系的同时,给类取一个别名,这种方式就可以很方便地从Mysql切换到Oracle
// \Yii::$container->set('db', 'app\components\Mysql');
// \Yii::$container->setSingleton('db', 'app\components\Mysql');

// 注册依赖关系的同时,给类取别名,并指定类的属性的值(这种方式最常用)
\Yii::$container->set('db', [
            'class'        =>    'app\components\Mysql',
            'username'    =>    'root',
        ]);
然后,在项目入口文件  /basic/web/index.php 中引入该配置文件,添加下面的一行代码即可:
require __DIR__ . '/../config/container.php';

最后,在控制器层   /basic/controllers,新增一个控制器文件  DiController.php,用于测试,代码如下:

    get('app\components\Mysql'));  // 实例化对象
//         echo '
    
      
      
      
      
'; // var_dump(\Yii::$container->get('app\components\Mysql')); var_dump(\Yii::$container->get('db')); // 实例化对象 } }
在浏览器中,访问  http://basic.com/di/index 进行测试。

其实,Yii 中的注册组件就是依赖注入。当我们要将一个封装好的操作类依赖注入时,既可以使用上面的方式,也可以使用注册组件的方式。

你可能感兴趣的:(Yii,Yii,2.0,框架学习笔记,Yii,依赖注入)