YII框架的依赖注入容器
依赖注入(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框架的依赖注入容器的更多相关文章
- YII框架的依赖注入容器与服务定位器简述
依赖注入容器 依赖注入(Dependency Injection,DI)容器就是一个对象use yii\di\Container,它知道怎样初始化并配置对象及其依赖的所有对象. 依赖注入和服务定位器都 ...
- yii依赖注入和依赖注入容器
依赖注入和依赖注入容器¶ 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Ser ...
- [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务
毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...
- Yii2.0 依赖注入(DI)和依赖注入容器的原理
依赖注入和依赖注入容器 为了降低代码耦合程度,提高项目的可维护性,Yii采用多许多当下最流行又相对成熟的设计模式,包括了依赖注入(Denpdency Injection, DI)和服务定位器(Serv ...
- yii2之依赖注入与依赖注入容器
一.为什么需要依赖注入 首先我们先不管什么是依赖注入,先来分析一下没有使用依赖注入会有什么样的结果.假设我们有一个gmail邮件服务类GMail,然后有另一个类User,User类需要使用发邮件的功能 ...
- webapi框架搭建-依赖注入之autofac
前言 c#的依赖注入框架有unity.autofac,两个博主都用过,感觉unity比较简单而autofac的功能相对更丰富(自然也更复杂一点),本篇将基于前几篇已经创建好的webapi项目,引入au ...
- IoC 依赖注入容器 Unity
原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静 ...
- [ASP.NET Core 3框架揭秘] 依赖注入:控制反转
ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...
- [ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期
生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例.虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的.在我们提供的依赖注入 ...
随机推荐
- nginx配置http静态站点服务器
1. 系统环境Windows 10 2. 设置静态站点目录,注意不要出现中文(这里踩了很多坑,可以查看错误日志error.log, “No mapping for the Unicode char ...
- Core 导出(流和URL两种)
1.流 2.URL 两种都是使用Epplus 1. EPPlus的基本介绍 EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010 文件的开源组 ...
- C# vb .net实现亮度调整特效滤镜效果
在.net中,如何简单快捷地实现Photoshop滤镜组中的亮度调整呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- sql group by hour 按小时分组统计
Time字段以小时分组统计 select datepart(hour,time) hour,count(1) count from table where Similarity<75 group ...
- 线程池ThreadPool实战
线程池ThreadPool 线程池概念 常用线程池和方法 1.测试线程类 2.newFixedThreadPool固定线程池 3.newSingleThreadExecutor单线程池 4.newCa ...
- js 的七大原则--单一原则、开闭原则、替换原则(一)
一.前言: js 的七大设计原则: 1.单一原则 2.开闭原则 3.里氏替换原则 4.依赖倒转原则 5.接口隔离原则 6.合成复用原则 7.迪米尔法则 二.单一原则 1.定义:单一原则就是一个对象或者 ...
- python day 9: xlm模块,configparser模块,shutil模块,subprocess模块,logging模块,迭代器与生成器,反射
目录 python day 9 1. xml模块 1.1 初识xml 1.2 遍历xml文档的指定节点 1.3 通过python手工创建xml文档 1.4 创建节点的两种方式 1.5 总结 2. co ...
- JavaScript之循环语句
(1)while语句 while(条件){ 条件为真,进入循环体.出现0 null undefined false其中任意一种情况,条件即为假 循环体 } 案例: var n=0; var count ...
- Python学习日记(六) 浅深copy
浅深copy即完全复制一份和部分复制一份 浅深copy在列表数据量较大时不建议使用,比较消耗内存资源 1.赋值运算 l1 = [1,'s',[1,2,3]] l2 = l1 print(id(l1), ...
- WinServer-文件共享端口
When turning on Firewall, please assure that “File and Printer Sharing” on current network profile i ...