- 依赖注入:(1)应该依赖于抽象而不依赖于具体。依赖抽象就是指依赖接口/约定/抽象类,这样容易扩展。(2)通过构造注入、属性设置或者方法调用。
class Database { protected $adapter; public function __construct(MySqlAdapter $adapter) { $this->adapter = $adapter; //依赖于具体的实例 } } class MysqlAdapter {}
class Database { protected $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; //依赖于抽象 } } interface AdapterInterface {} class MysqlAdapter implements AdapterInterface {}
现在
Database
类依赖于接口,相比依赖于具体实现有更多的优势。假设你工作的团队中,一位同事负责设计适配器。在第一个例子中,我们需要等待适配器设计完之后才能单元测试。现在由于依赖是一个接口/约定,我们能轻松地模拟接口测试,因为我们知道同事会基于约定实现那个适配器
这种方法的一个更大的好处是代码扩展性变得更高。如果一年之后我们决定要迁移到一种不同的数据库,我们只需要写一个实现相应接口的适配器并且注入进去,由于适配器遵循接口的约定,我们不需要额外的重构。
引自:http://laravel-china.github.io/php-the-right-way/#dependency_injection - 讲解依赖注入文章:https://www.jianshu.com/p/c31c202fa369
相关文章
- 08-22依赖注入 —— Spring(四)
- 08-22马丁 福勒 Martin Fowler 关于依赖注入和反转控制的区别
- 08-22使用Ninject进行DI(依赖注入)
- 08-22Spring 依赖注入的两种实现方式
- 08-22为什么使用依赖注入和控制反转
- 08-22vue—依赖注入
- 08-22设计模式之依赖倒置原则
- 08-22spring 配置bean的方法及依赖注入发方式
- 08-22Spring-依赖注入对象
- 08-22spring4笔记----依赖注入的两种形式