三层架构:从高到底分别是
用户界面层(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 文件,作为依赖关系的配置文件,代码如下:
然后,在项目入口文件
/basic/web/index.php 中引入该配置文件,添加下面的一行代码即可:
require __DIR__ . '/../config/container.php';
最后,在控制器层
/basic/controllers,新增一个控制器文件
DiController.php,用于测试,代码如下:
在浏览器中,访问
http://basic.com/di/index 进行测试。
其实,Yii 中的注册组件就是依赖注入。当我们要将一个封装好的操作类依赖注入时,既可以使用上面的方式,也可以使用注册组件的方式。