依赖注入模式(Dependency Injection)

由 学院君 创建于5年前, 最后更新于 10个月前

版本号 #3

18333 views

16 likes

0 collects

1、模式定义

依赖注入(Dependency Injection)是控制反转(Inversion of Control)的一种实现方式。

我们先来看看什么是控制反转。

当调用者需要被调用者的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例,但在这里,创建被调用者的工作不再由调用者来完成,而是将被调用者的创建移到调用者的外部,从而反转被调用者的创建,消除了调用者对被调用者创建的控制,因此称为控制反转。

要实现控制反转,通常的解决方案是将创建被调用者实例的工作交由 IoC 容器来完成,然后在调用者中注入被调用者(通过构造器/方法注入实现),这样我们就实现了调用者与被调用者的解耦,该过程被称为依赖注入。

依赖注入不是目的,它是一系列工具和手段,最终的目的是帮助我们开发出松散耦合(loose coupled)、可维护、可测试的代码和程序。这条原则的做法是大家熟知的面向接口,或者说是面向抽象编程。

2、UML 类图

3、示例代码

在本例中,我们在 Connection 类(调用者)的构造方法中依赖注入 Parameters 接口的实现类(被调用者),如果不使用依赖注入的话,则必须在 Connection 中创建该接口的实现类实例,这就形成紧耦合代码,如果我们要切换成该接口的其它实现类则必须要修改代码,这对到测试和扩展而言都是极为不利的。

AbstractConfig.php

namespace DesignPatterns\Structural\DependencyInjection;

/**

* AbstractConfig类

*/

abstract class AbstractConfig

{

/**

* @var Storage of data

*/

protected $storage;

public function __construct($storage)

{

$this->storage = $storage;

}

}

Parameters.php

namespace DesignPatterns\Structural\DependencyInjection;

/**

* Parameters接口

*/

interface Parameters

{

/**

* 获取参数

*

* @param string|int $key

*

* @return mixed

*/

public function get($key);

/**

* 设置参数

*

* @param string|int $key

* @param mixed $value

*/

public function set($key, $value);

}

ArrayConfig.php

namespace DesignPatterns\Structural\DependencyInjection;

/**

* ArrayConfig类

*

* 使用数组作为数据源

*/

class ArrayConfig extends AbstractConfig implements Parameters

{

/**

* 获取参数

*

* @param string|int $key

* @param null $default

* @return mixed

*/

public function get($key, $default = null)

{

if (isset($this->storage[$key])) {

return $this->storage[$key];

}

return $default;

}

/**

* 设置参数

*

* @param string|int $key

* @param mixed $value

*/

public function set($key, $value)

{

$this->storage[$key] = $value;

}

}

Connection.php

namespace DesignPatterns\Structural\DependencyInjection;

/**

* Connection类

*/

class Connection

{

/**

* @var Configuration

*/

protected $configuration;

/**

* @var Currently connected host

*/

protected $host;

/**

* @param Parameters $config

*/

public function __construct(Parameters $config)

{

$this->configuration = $config;

}

/**

* connection using the injected config

*/

public function connect()

{

$host = $this->configuration->get('host');

// connection to host, authentication etc...

//if connected

$this->host = $host;

}

/*

* 获取当前连接的主机

*

* @return string

*/

public function getHost()

{

return $this->host;

}

}

4、测试代码

Tests/DependencyInjectionTest.php

namespace DesignPatterns\Structural\DependencyInjection\Tests;

use DesignPatterns\Structural\DependencyInjection\ArrayConfig;

use DesignPatterns\Structural\DependencyInjection\Connection;

class DependencyInjectionTest extends \PHPUnit_Framework_TestCase

{

protected $config;

protected $source;

public function setUp()

{

$this->source = include 'config.php';

$this->config = new ArrayConfig($this->source);

}

public function testDependencyInjection()

{

$connection = new Connection($this->config);

$connection->connect();

$this->assertEquals($this->source['host'], $connection->getHost());

}

}

Tests/config.php

return array('host' => 'github.com');

5、总结

依赖注入模式需要在调用者外部完成容器创建以及容器中接口与实现类的运行时绑定工作,在 Laravel 中该容器就是服务容器,而接口与实现类的运行时绑定则在服务提供者中完成。此外,除了在调用者的构造函数中进行依赖注入外,还可以通过在调用者的方法中进行依赖注入。

php 依赖注入框架,依赖注入模式(Dependency Injection)相关推荐

  1. Spring MVC快速教程:依赖注入 Spring MVC Fast Tutorial: Dependency Injection

    What are we going to build? Use singletons of CarManager and BrandManager instead of creating multip ...

  2. Ioc模式(又称DI:Dependency Injection 依赖注射)

    分离关注( Separation of Concerns : SOC)是Ioc模式和AOP产生最原始动力,通过功能分解可得到关注点,这些关注可以是 组件Components, 方面Aspects或服务 ...

  3. dagger2 注入_Android依赖注入– Dagger 2

    dagger2 注入 In this tutorial, we'll discuss and implement Dependency Injection (DI) in our android ap ...

  4. .NET Core部署中你不了解的框架依赖与独立部署

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9703460.html NET Core项目发布的时候你有没有注意到这两个选项呢?有没有纠结过框架依赖与独 ...

  5. IoC容器和Dependency Injection模式

    注:本文转自http://insights.thoughtworkers.org/injection/,请尊重译者的劳动成果,转载需注明出处. 2017年3月3日 by Martin Fowler L ...

  6. IoC 容器和 Dependency Injection 模式[转]

    转自:插图版<IoC 容器和Dependency Injection 模式> 原文地址:Inversion of Control Containers and the Dependency ...

  7. IoC容器和 Dependency Injection模式 Inversion of Control Containers and the Dependency Injection pattern

    原文链接:http://www.martinfowler.com/articles/injection.html 文末有中文翻译版本,martinfowler上有提供中文版的pdf,也可以自行下载 中 ...

  8. angular示例_Angular Dependency Injection用示例解释

    angular示例 什么是依赖注入? (What is Dependency Injection?) 动机 (Motivation) Dependency Injection is often mor ...

  9. [ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式

    IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式 ...

最新文章

  1. checkbox wpf 改变框的大小_使用Photoshop智能对象调整图像大小而不会丢失质量
  2. STM32学习之路-感觉自己走到了一个天大的坑里了!
  3. 网络操作系统P12页答案
  4. linux下ORACLE的Sqlplus命令
  5. java cpu过高排查_涨薪秘籍:JAVA项目排查cpu负载过高
  6. 计算机技术员好学吗,电脑技术员,沦落到如此地步...
  7. Wordfence Premium 安全防护 WordPress插件
  8. 【Python】GUI编程(Tkinter)教程
  9. 华为鸿蒙系统适合机型,华为鸿蒙os2.0系统适用哪些机型
  10. mysql简介博客_mysql简介
  11. matlab自带的信号,实验一 连续时间信号在MATLAB中的表示..ppt
  12. shell进入特权模式_GRUB引导下进Linux单用户模式的三种方式,修改root密码
  13. LVS详解(六)——LVS DR模式实战
  14. mysql 安装问题汇总_Windows 10 下MySQL安装及常见问题
  15. 管理感悟:承认错误,善于总结
  16. Linux下 SVN 常用命令
  17. 做了一个收录 rss opml 文件的仓库,欢迎推荐 opml
  18. 给对象添加一个新对象
  19. SAP xsengine 403 - Forbidden(The server refused to fulfill the request.)
  20. 软考——程序设计语言概述

热门文章

  1. 论文学习5-NODE2BITS: Compact Time- and Attribute-aware Node Representations for User Stitching
  2. .net如何引用该命名空间
  3. H5常用拖放事件解析
  4. Nim游戏(初谈博弈)
  5. CSDN专訪:大数据时代下的商业存储
  6. java修改list中对象的值_Java中List集合的一点总结
  7. linux alsa声卡命令,Linux ALSA声卡驱动之一:ALSA架构简介
  8. bs 程序用户个性化设置保存_想更改win10设置,这12种打开方法你不可不知,方便又快捷...
  9. 的图片怎么循环渲染_十分钟教你做个炫酷的图片切换过度效果
  10. python二分法查找算法_排序算法和二分法查找