依赖注入(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. C#中的Process类使用

    有时候,用户在进行某个操作时,程序运行到某个阶段突然崩溃,我们需要让程序自动重启,重新执行用户之前的操作,当发现主程序还存在,就重启用户执行的附加程序.这时候Process就派上了用场. 控制台测试用 ...

  2. [jsp学习笔记] jsp基础知识 数据初始化、同步

  3. C# vb .net实现消除红眼效果

    在.net中,如何简单快捷地实现Photoshop滤镜组中的消除红眼效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...

  4. .Net 取树形结构的数据

    最近遇到了无限层级数据要读取的问题,所有就写了个. 根据当前所有父级,查询出子级内容 private void GetTypeOfWorkforTree(out List<TypeOfWorkD ...

  5. 【洛谷 P2408】 不同子串个数(后缀自动机)

    题目链接 裸体就是身体. 建出\(SAM\),\(DAG\)上跑\(DP\),\(f[u]=1+\sum_{(u,v)\in DAG}f[v]\) 答案为\(f[1]-1\)(因为根节点没有字符) # ...

  6. semaphore demo 并行 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    import 'dart:async'; import 'package:semaphore/semaphore.dart'; import 'dart:io'; import 'dart:conve ...

  7. 安装g++

    :yum install g++ 错误 :No package g++ available :yum install gcc-c++ Complete!

  8. SVN commit:remains in tree-conflict错误的解决办法

    转自:https://chenjinbo1983.iteye.com/blog/2005123 昨天在提交一个新类包的时候,出错了,重新提交了几次也不行. 错误是:Aborting commit: ‘ ...

  9. Air for ANE:一星期的调试笔记

    来源:http://blog.csdn.net/hero82748274/article/details/8656674 第一次尝试ANE的东西,让我感觉到很折腾人.adobe 出的这个方案虽然可以解 ...

  10. [LeetCode] 448. 找到所有数组中消失的数字 ☆

    描述 给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您 ...