依赖注入(Dependency Injection,DI)容器就是一个对象,它知道怎样初始化并配置对象及其依赖的所有对象。

所谓的依赖就是,一个对象,要使用另外一个对象才能完成某些功能。那么这个对象就依赖于被使用的对象。

例如:

/**
* 厨师
*/
class cook {
/**
* 制作食物
*/
public function cooking() {
$food = new food();
echo $food->get(),"汤<br/>";
}
}
/**
* 食材
*/
class food{
/**
* 提供食材
*/
public function get() {
return '西红柿鸡蛋';
}
}

厨师类 在 制作食物 的时候需要用到 食材类 提供食材,才能完成食物的制作。

所以厨师类依赖于食材类。

但是这种直接在类内部实例化一个对象的方式来得到对象,是一种强耦合的做法。

应该把食材的提供者(数据结构)与食物的制作方法(算法)进行分离。

再改动一下代码:

/**
* 厨师
*/
class cook {
private $food;
public function __construct(food $food) {
$this->food = $food;
}
/**
* 制作食物
*/
public function cooking() {
echo $this->food->get(),"汤<br/>";
}
}
/**
* 食材
*/
class food{
/**
* 提供食材
*/
public function get() {
return '西红柿鸡蛋';
}
}

改动之后的代码是在实例化一个厨师的时候就把食材类传递进去。

但是这个时候,如果改动了,food类,那么极有可能导致cook类不能得到食材。这个时候它们之间还是强耦合在一块。

况且厨师不可能总是做西红柿鸡蛋汤啊,他需要其它食材。

再改动一下代码:

/**
* 厨师
*/
class cook {
private $food;
public function __construct(food $food) {
$this->food = $food;
}
/**
* 制作食物
*/
public function cooking() {
echo $this->food->get(),"汤<br/>";
}
}
/**
* 食材接口
*/
interface food{
public function get();
}
/**
* 海鲜类食材
*/
class seafood implements food{
/**
* 提供食材
*/
public function get() {
return '鲜鱼';
}
}
/**
* 家禽类食材
*/
class fowlfood implements food{
/**
* 提供食材
*/
public function get() {
return '西红柿鸡蛋';
}
}

把 食材提供 用一个接口进行约定,然后各类食材都必须实现那个接口。

通过接口,把 cook 与 food 彻底分开。

这样我们的客户端代码就是:

$cook = new cook(new seafood);
$cook->cooking();
$cook = new cook(new fowlfood);
$cook->cooking();

这样在每次使用$cook对象的时候,都需要new一下 实现了food接口的类。

那么对于这种依赖的关系,如果能够让一个对象专门来处理,而不是手工去new一下food类。那么这种处理过程就叫依赖注入。

这个处理依赖关系的对象就是Yii框架中的叫“”容器”的对象。

下面是Yii中依赖注入容器的使用:

<?php
namespace app\controllers;
use yii\web\Controller;
use \YII; class TestController extends Controller
{
public function actionIndex() {
//实例化依赖注入容器
$container = new \yii\di\Container;
//设置food接口与具体的实现类之间的关系
$container->set('app\controllers\food','app\controllers\fowlfood');
//$container->set('app\controllers\food','app\controllers\seafood');
//通过依赖注入容器得到厨师对象
$cook = $container->get('app\controllers\cook');
$cook->cooking();
}
} /**
* 厨师
*/
class cook {
private $food;
public function __construct(food $food) {
$this->food = $food;
}
/**
* 制作食物
*/
public function cooking() {
echo $this->food->get(),"汤<br/>";
}
}
/**
* 食材接口
*/
interface food{
public function get();
}
/**
* 海鲜类食材
*/
class seafood implements food{
/**
* 提供食材
*/
public function get() {
return '鲜鱼';
}
}
/**
* 家禽类食材
*/
class fowlfood implements food{
/**
* 提供食材
*/
public function get() {
return '西红柿鸡蛋';
}
}

YII框架的依赖注入容器的更多相关文章

  1. YII框架的依赖注入容器与服务定位器简述

    依赖注入容器 依赖注入(Dependency Injection,DI)容器就是一个对象use yii\di\Container,它知道怎样初始化并配置对象及其依赖的所有对象. 依赖注入和服务定位器都 ...

  2. yii依赖注入和依赖注入容器

    依赖注入和依赖注入容器¶ 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Ser ...

  3. [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务

    毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...

  4. Yii2.0 依赖注入(DI)和依赖注入容器的原理

    依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...

  5. yii2之依赖注入与依赖注入容器

    一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...

  6. webapi框架搭建-依赖注入之autofac

    前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...

  7. IoC 依赖注入容器 Unity

    原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...

  8. [ASP.NET Core 3框架揭秘] 依赖注入:控制反转

    ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...

  9. [ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期

    生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例.虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的.在我们提供的依赖注入 ...

随机推荐

  1. 你有自信写while(true)吗?

    每次写while(true)的时候会不会心虚? 特别逻辑稍微复杂一点

  2. Thomas Brinkhoff 基于路网的移动对象生成器的使用[第二版]

    Thomas Brinkhoff 基于路网的移动对象生成器的使用 Thomas Brinkhoff 基于路网的移动对象生成器的使用 相关操作的说明 相关文件的说明 运行 导入eclipse后运行时选择 ...

  3. Java操作Hadoop集群

    mavenhdfsMapReduce 1. 配置maven环境 2. 创建maven项目 2.1 pom.xml 依赖 2.2 单元测试 3. hdfs文件操作 3.1 文件上传和下载 3.2 RPC ...

  4. 全面学习 Python 包:包的构建与分发

    首发于公众号:Python编程时光 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而 ...

  5. 【转载】JVM结构、GC工作机制详解

    文章主要分为以下四个部分 JVM结构.内存分配.垃圾回收算法.垃圾收集器.下面我们一一来看. 一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知, ...

  6. 微信小程序 image组件坑

    远程图片 在真机上测试时 image组件只能显示http请求的图片, 对https 与 //xxx.xxx.xx 之类的不能显示. 可显示 'http://img.alicdn.com/i2/8323 ...

  7. commonjs 与 es6相关Module语法的区别

    1.export 在接口名字与模块内部的变量之间建立了一一对应的关系,export输出的接口,与其模块内对应的变量值是动态绑定的,即通过暴露的接口可以取到模块内与之对应绑定变量的实时的值. commo ...

  8. Oracle 操作数据库(增删改语句)

    对数据库的操作除了查询,还包括插入.更新和删除等数据操作.后3种数据操作使用的 SQL 语言也称为数据操纵语言(DML). 一.插入数据(insert 语句) 插入数据就是将数据记录添加到已经存在的数 ...

  9. self attention pytorch代码

    实现细节; 1.embedding 层 2.positional encoding层:添加位置信息 3,MultiHeadAttention层:encoder的self attention 4,sub ...

  10. JavaScript HTML DOM元素节点常用操作接口

    在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType :节点的类 ...