目的
实现了松耦合的软件架构,可得到更好的测试,管理和扩展的代码

用法
DatabaseConfiguration 被注入 DatabaseConnection 并获取所需的 $config 。如果没有依赖注入模式, 配置将直接创建 DatabaseConnection 。这对测试和扩展来说很不好。

例子
Doctrine2 ORM 使用依赖注入。 例如,注入到 Connection 对象的配置。 对于测试而言, 可以轻松的创建可扩展的模拟数据并注入到 Connection 对象中。

Symfony 和 Zend Framework 2 已经有了依赖注入的容器。他们通过配置的数组来创建对象,并在需要的地方注入 (在控制器中)。

UML 图
https://zsrimg.ikafan.com/file_images/article/202105/2021525154234366.png?2021425154243
代码DatabaseConfiguration.php
<?php

  1. namespace DesignPatterns\Structural\DependencyInjection;
  2. class DatabaseConfiguration
  3. {
  4. /**
  5. * @var string
  6. */
  7. private $host;
  8. /**
  9. * @var int
  10. */
  11. private $port;
  12. /**
  13. * @var string
  14. */
  15. private $username;
  16. /**
  17. * @var string
  18. */
  19. private $password;
  20. public function __construct(string $host, int $port, string $username, string $password)
  21. {
  22. $this->host = $host;
  23. $this->port = $port;
  24. $this->username = $username;
  25. $this->password = $password;
  26. }
  27. public function getHost(): string
  28. {
  29. return $this->host;
  30. }
  31. public function getPort(): int
  32. {
  33. return $this->port;
  34. }
  35. public function getUsername(): string
  36. {
  37. return $this->username;
  38. }
  39. public function getPassword(): string
  40. {
  41. return $this->password;

DatabaseConnection.php
<?php

  1. namespace DesignPatterns\Structural\DependencyInjection;
  2. class DatabaseConnection
  3. {
  4. /**
  5. * @var DatabaseConfiguration
  6. */
  7. private $configuration;
  8. /**
  9. * @param DatabaseConfiguration $config
  10. */
  11. public function __construct(DatabaseConfiguration $config)
  12. {
  13. $this->configuration = $config;
  14. }
  15. public function getDsn(): string
  16. {
  17. // 这仅仅是演示,而不是一个真正的 DSN
  18. // 注意,这里只使用了注入的配置。 所以,
  19. // 这里是关键的分离关注点。
  20. return sprintf(
  21. '%s:%s@%s:%d',
  22. $this->configuration->getUsername(),
  23. $this->configuration->getPassword(),
  24. $this->configuration->getHost(),
  25. $this->configuration->getPort()

测试Tests/DependencyInjectionTest.php
<?php

  1. namespace DesignPatterns\Structural\DependencyInjection\Tests;
  2. use DesignPatterns\Structural\DependencyInjection\DatabaseConfiguration;
  3. use DesignPatterns\Structural\DependencyInjection\DatabaseConnection;
  4. use PHPUnit\Framework\TestCase;
  5. class DependencyInjectionTest extends TestCase
  6. {
  7. public function testDependencyInjection()
  8. {
  9. $config = new DatabaseConfiguration('localhost', 3306, 'domnikl', '1234');
  10. $connection = new DatabaseConnection($config);
  11. $this->assertEquals('domnikl:1234@localhost:3306', $connection->getDsn());

更多相关文章

  1. Android自动化测试初探(四): 模拟键盘鼠标事件(Socket+Instrumentat
  2. android自动化测试工具简介
  3. Android获取状态栏和标题栏的高度
  4. 通过Setters方式对日期属性及日期格式进行IOC注入
  5. Java.lang.ClassNotFound Instrumentation 测试异常
  6. Android(安卓)CTS 总结
  7. 通过Setters方式对日期属性及日期格式进行IOC注入
  8. 通过Setters方式对日期属性及日期格式进行IOC注入
  9. 用PDO连接mysql,用预处理语句实现用户登录时防sql注入小结

随机推荐

  1. Android 版本号对应的SDK版本
  2. android 根据string 获取资源文件的id
  3. 自定义单选按钮(RadioButton)的样式
  4. android电池系统
  5. OSCHINA Android 客户端 - 手机相关软件
  6. Android回顾--(九) ListView和自定义适配
  7. [置顶] Android中几种预定义样式
  8. Android存储系统之源码篇
  9. Android关机重启实现
  10. 自定义View系列教程08--滑动冲突的产生及