依赖注入模式中,为什么用对象而不是用数组传递?
依赖注入(Dependence Injection, DI) 依赖注入是控制反转的一种设计模式。依赖注入的核心是把类所依赖的单元的实例化过程,放到类的外面去实现。依赖注入的实现离不开反射。
依赖注入(Dependence Injection, DI)
所谓的依赖注入,指将依赖的对象通过参数的形式一次性传入,使用时不需要显式 new
了,比如把A类所依赖的B类、C类等以属性或者构造函数等方式注入A类而不是直接在A类中实例化。
只要不是由内部生产(比如初始化、构造函数中通过工厂方法、自行手动 new 的),而是由外部以参数或其他形式注入的,都属于依赖注入(DI) 。
依赖注入需要利用反射实现,比如:
class A
{protected $b;public function __constrcut(B $b){$this->b = $b;}
}// 通过控制反转容器生成 A 的实例时,会通过反射发现 A 的构造函数需要一个 B 类的实例
// 于是自动向 A 类的构造函数注入 B 类的实例
$a = IoC::make(A::class);
依赖注入的实质就是把一个类不可更换的部分
和可更换的部分
分离开来,通过注入
的方式来使用,从而达到解耦的目的。
比如有一个 Mysql
数据库连接类如下:
class Mysql {private $host;private $port;private $username;private $password;private $db_name;public function __construct(){$this->host = '127.0.0.1';$this->port = 22;$this->username = 'root';$this->password = '';$this->db_name = 'db';}public function connect(){return mysqli_connect($this->host, $this->username, $this->password, $this->db_name, $this->port);}
}// 使用
$db = new Mysql();
$con = $db->connect();
可更换部分是数据库的配置
class Configuration
{private $host;private $port;private $username;private $password;private $db_name;public function __construct($host, $port, $username, $password, $db_name){$this->host = $host;$this->port = $port;$this->username = $username;$this->password = $password;$this->db_name = $db_name;}public function getHost(){return $this->host;}public function getPort(){return $this->port;}public function getUsername(){return $this->username;}public function getPassword(){return $this->password;}public function getDbName(){return $this->db_name;}
}
不可更换部分是Mysql数据库的连接操作
class Mysql
{private $configuration;public function __construct(Configuration $config){$this->configuration = $config;}public function connect(){return mysqli_connect($this->configuration->getHost(),$this->configuration->getUsername() ,$this->configuration->getPassword,$this->configuration->getDbName(),$this->configuration->getPort());}
}
这样就完成了配置文件和连接逻辑的分离,使用如下:
$config = new Configuration('127.0.0.1', 'root', '', 'my_db', 22);
$db = new Mysql($config);
$con = $db->connect();
$config是注入Mysql的,这就是所谓的依赖注入。
总结
注入可以理解成从外面把东西打进去。因此,依赖注入模式中,要分清内和外,要解除依赖的类内部就是内,实例化所依赖单元的地方就是外。在外通过构造形参,为类内部的抽象单元提供实例化,达到解耦的目的,使下层依赖于上层,而不是上层依赖于下层。
因此,依赖注入模式中,要用对象传递,通过一个实例的反射来实现,这是数组做不到的。
转载于:https://www.cnblogs.com/sunshineliulu/p/10747756.html
依赖注入模式中,为什么用对象而不是用数组传递?相关推荐
- 控制反转容器依赖注入模式(转)
轻量级容器在Java社区近来可是风起云涌,这些容器能将来自不同项目的逐渐集结为一个内聚的应用程序.这些容器都是基于一个共同的模式,这个模式决定了容器如何完成组件装配,人们统称之为:"控制反转 ...
- [ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式 ...
- php 依赖注入框架,依赖注入模式(Dependency Injection)
依赖注入模式(Dependency Injection) 由 学院君 创建于5年前, 最后更新于 10个月前 版本号 #3 18333 views 16 likes 0 collects 1.模式定义 ...
- 如何检查服务已在依赖注入容器中注册
前言 依赖关系注入(DI),是一种在类及其依赖项之间实现控制反转(IoC)的技术.在ASP.NET Core中,依赖关系注入是"一等公民",被大量使用. 但是有时,我们仅仅只需要知 ...
- ASP.NET Core依赖注入容器中的动态服务注册
介绍 在ASP.NET Core中,每当我们将服务作为依赖项注入时,都必须将此服务注册到ASP.NET Core依赖项注入容器.但是,一个接一个地注册服务不仅繁琐且耗时,而且容易出错.因此,在这里,我 ...
- Java 控制反转和依赖注入模式【翻译】【整理】
Inversion of Control Containers and the Dependency Injection pattern --Martin Fowler 本文内容 Component ...
- Angular 中的依赖注入link
Angular 中的依赖注入link 依赖注入(DI)是一种重要的应用设计模式. Angular 有自己的 DI 框架,在设计应用时常会用到它,以提升它们的开发效率和模块化程度. 依赖,是当类需要执行 ...
- 使用Xamarin.Forms的企业应用程序模式(电子书)--依赖注入
通常,在实例化对象时调用类构造函数,并将对象需要的任何值作为参数传递给构造函数. 这是依赖注入的一个例子,具体称为构造函数注入. 对象需要的依赖项被注入到构造函数中. 通过将依赖项指定为接口类型,依赖 ...
- 依赖注入(di)模式_Java依赖注入– DI设计模式示例教程
依赖注入(di)模式 Java Dependency Injection design pattern allows us to remove the hard-coded dependencies ...
最新文章
- tcp断开连接,4次握手,为什么wireshark 只能抓到3个包?
- 【 FPGA 】状态机,FPGA的灵魂
- 基于多进程和基于多线程服务器的优缺点及nginx服务器的启动过程
- 创建一个framework
- 第 4-1 课:BIO、NIO、AIO 详解 + 面试题
- 关于scrollIntoView()不能使输入框显示在可视区域的问题
- GridView中使用DropDownList的OnSelectedIndexChanged事件
- matlab简支梁有限元分析,1.3 简支梁的有限元分析
- oracle获取中位数
- Microsoft Excel 教程 如何在 Excel 中隐藏或显示行或列?
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
- iOS开发之网络监听(一)Reachability
- 学校计算机的使用英语作文180字,英文作文学生开车去学校,180字
- android 斜边_Android -- 一个滑动旋转的弧形菜单
- cl.clcl.news/index.php,公布一些后门网址
- c7200-adventerprisek9.124-9.T.bin
- 项目总结-网络舆情分析
- 计算机内存4gb是多大,电脑内存多大合适?你的电脑经常卡的秘密运
- electron 应用程序updater实现热更新
- 设计模式之-代理模式
热门文章
- Qt中常用的QChar QByteArry QString数据类型转换方法
- vue.js 引用背景图 background 无效的3种解决办法
- [资源]181个Python开源项目分享!
- 卷积神经网络(CNN)介绍
- Concurrent HTTP connections in Node.js
- Day 14 20190129 老男孩python学习第14天 内容整理
- C++学习(一)之Visual Studio安装以及首次使用
- 数据结构与算法——冒泡排序(改进后)
- Web 前沿——HTML5 Form Data 对象的使用(转)
- mysql列属性auto(mysql笔记四)