依赖注入(DI)与服务容器(IoC)
参考文章:http://www.yuansir-web.com/2014/03/20/%E7%90%86%E8%A7%A3php-%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5laravel-ioc%E5%AE%B9%E5%99%A8/?preview
我们在建一个类时,在类的内部有可能会用到另外一个对象实例举个栗子:
class User{
public function getUser(){
$db = new DB(); // 这里产生了对数据库连接类的依赖
$db->select('select username form user..');
...
}
}
当我们修改了DB这个类时肯定要回来修改User这个类,可以想象DB类肯定不是只用在User类中,一个项目中要有许多类要用到DB类,如果DB类修改了(举个不恰当的例子:DB这个类改名了)那必须要把项目中所有用到db类的类都要作修改。
这个时候可以这样解决
class User{
public function getUser(DB $db){
//$db = new DB(); // 依赖消失
$db->select('select username form user..');
...
}
}
这个时候想调用getUser方法就必须要“注入”$db。
实际中我们的User类肯定不是只会用到getUser这个方法的,还有可能会用到getUsername、getUserAge、getUserSex...等等,难道我们要为每个方法都加一个$db参数吗?当然不可能所以我们再来完善一下这个User类:
class User{
private $db;
//*
public function __construct(DB $db){
$this->db = $db;
}
/*/
public function getDb(DB $db){
$this->db = $db;
}
//*/
public function getUser(){
$this->db->select('select username form user..');
...
}
public function getUserAge(){
$this->db->select('select userage form user..');
...
}
public function getUserSex(){
$this->db->select('select usersex form user..');
...
}
}
可以看到我们可以在构造器和getDb方法中注入$db。
好了,我们已经实现“依赖反转”了!但是!!!假如我们User类还需要其他类呢?举个很不恰当的牵强的栗子:
我们把username放到memcache 中,把userage放到session中,把usersex放到redis中(这。。。很不实际)那我们的类就变成这个样子了
class User{
private $db;
private $mem;
private $redis;
...
public function __construct(DB $db , Mem $mem , Redis $redis , Session $session ...... ){
$this->db = $db;
$this->mem = $mem;
$this->redis = $redis;
}
public function getUser(){
$this->db->select('select username form user..');
...
}
public function getUserAge(){
$this->mem->get('userage');
...
}
public function getUserSex(){
$this->redis->get('usersex');
...
}
}
要在控制器里放那么多实例。而且如果要使用User类的话还有实例这么多存贮类,不累吗?代码肯定一团糟!
这个时候可以用一个工厂来“完善”一下:
class UserFactory{
public static function getUserObj(){
$db = new DB();
$mem = new Mem();
...
$user = new ($db , $mem , ...);
return $user;
}
}
这样就好看多了,但是!!!然并卵,我们还是要实例化各个存储类(db,mem,redis。。。)
现在该服务容器(IoC)登场了:
class User{
private $IoC;
public function __construct(IoC $IoC){
$this->IoC = $IoC;
}
public function getUser(){
$this->IoC->get('db')->select('select username form user..');
...
}
public function getUserAge(){
$this->IoC->get('mem')->get('userage');
...
}
public function getUserSex(){
$this->IoC->get('redis')->get('usersex');
...
}
}
$IoC = new IoC();
// 这里使用了闭包函数,$di->set的时候实际上并没有实例化,
// 而是在$di->get()的时候才执行了匿名函数并将对象返回。
$IoC->set('db' , function(){
return new DB(...);
});
$IoC->set('mem' , funciton(){
return new Mem(...);
});
$IoC->set('redis' , funciton(){
return new Redis(...);
});
$user = new User($IoC);
大功告成!!!!!!
DI与IoC就是这么简单。
分享几个链接:
symfony中服务容器:
http://www.cnblogs.com/Seekr/archive/2012/06/19/2554934.html
听 Fabien Potencier 谈Symfony2 之 《What is Dependency Injection ?》
http://www.cnblogs.com/Seekr/archive/2012/06/20/2556463.html
另外还有laravel、struts2、spring有关依赖注入的文章可以自行搜索。
依赖注入(DI)与服务容器(IoC)的更多相关文章
- 依赖注入(DI)和控制反转(IOC)
依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...
- PHP依赖注入(DI)和控制反转(IoC)详解
这篇文章主要介绍了PHP依赖注入(DI)和控制反转(IoC)的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程 ...
- 话说 依赖注入(DI) or 控制反转(IoC)
科普:首先依赖注入和控制反转说的是同一个东西,是一种设计模式,这种设计模式用来减少程序间的耦合,鄙人学习了一下,看TP官网还没有相关的文章,就写下这篇拙作介绍一下这种设计模式,希望能为TP社区贡献一些 ...
- 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC)
前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测. 这里想先说明两点: 依赖注入和控制反转不是高级 ...
- ASP.NET MVC进阶之路:深入理解依赖注入(DI)和控制反转(IOC)
0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只定义一个注入点.在程序运行过程中,客户 ...
- PHP 依赖注入(DI) 和 控制反转(IoC)
要想理解 PHP 依赖注入 和 控制反转 两个概念,就必须搞清楚如下的两个问题: DI —— Dependency Injection 依赖注入 IoC —— Inversion of Control ...
- 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。
学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 聊一聊PHP的依赖注入(DI) 和 控制反转(IoC)
简介 IoC Inversion of Control 控制反转DI Dependency Injection 依赖注入 依赖注入和控制反转说的实际上是同一种东西,它们是一种设计模式,这种设计模式用来 ...
- 如何理解 PHP的依赖注入(DI) 和 控制反转(IoC)
名词解释: IoC - Inversion of Control 控制反转 DI - Dependency Injection 依赖注入 依赖注入和控制反转说的实际上是同一个东西,它们是一种设计模式, ...
随机推荐
- Java学习笔记二——标识符和关键字
标识符 定义 标识符的定义:对各种变量.方法和类等要素命名时使用的字符序列成为标识符. 简单地说,就是凡是自己可以起名字的地方都叫标识符,都要遵守标识符的规则. 命名规则 标识符只能由字母.下划线&q ...
- Java学习笔记一——安装JDK并配置环境变量
下载安装JDK1.8 在官网上下载JDK,官网地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...
- c# 动态执行脚本,相关的几个脚本引擎.
Jint 嵌入式的javascript脚本支持引擎,一直都在更新,对各种方法支持也比较好,可以 C# 交互. https://github.com/sebastienros/jint Jurass ...
- [WPF实用技巧]如何使WPF的TreeView节点之间有连线
示例代码:TreeViewEx.zip 原文地址:http://www.codeproject.com/Tips/673071/WPF-TreeView-with-WinForms-Style-Fom ...
- 【C语言学习】《C Primer Plus》第9章 函数
学习总结 1.函数有利于我们可以省去重复的代码,函数可以使程序更加模块化,从而有利于程序的阅读.修改和完善.我们在系统设计或架构设计的时候,往往追求的是模块化.组件化.松耦合,而函数就是其代码的表现. ...
- 上层建筑——DOM元素的特性与属性(dojo/dom-attr)
上一篇返本求源中,我们从DOM基础的角度出发,总结了特性与属性的关系.本文中,我们来看看dojo框架是如何处理特性与属性的.dojo框架中特性的处理位于dojo/dom-attr模块属性的处理为与do ...
- 【css3】--四种气泡
在聊天的场景中,聊天内容需要用到气泡修饰,如下图.下面一一讲解. 图片式: 第一个样式是京东客服,气泡的圆角和钩子都是用了图片.使用了一个table组合成了一个圆角的框框.lm样式拼出了钩子. < ...
- 推荐书籍 -《移动App测试的22条军规》
在今天的博文中,博主希望给大家分享一本博主同事黄勇的最新利作:<移动App测试的22条军规>.黄勇是ThoughtWorks资深敏捷QA和咨询师.对于我来说,和黄勇在一起的工作的这个项目, ...
- IO完成端口
从MSDN中翻译了IO完成端口的文章,不得不说翻译的很烂,英语需要继续提高啊... 在一个多处理器系统上,IO完成端口提供一个非常高效的线程模型来处理多个异步IO请求.当一个进程创建了一个IO完成端口 ...
- Java提高篇(三三)-----Map总结
在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...