理解依赖注入

图片alt

原文地址:http://php-di.org/doc/understanding-di.html

题外话,原本是想直接翻译这篇文章的,但是后来想想还是算了,采用翻译 + 自己理解的方案来写东西,这样自己也很舒服

依赖注入和依赖注入容器的区别

  • 依赖注入是帮助你编写更好的代码的一种方法
  • 容器是帮助依赖注入的工具

个人理解,依赖注入其实就是一种编程的模式,是代码耦合性更低,方便我们替换某些代码部件, 而容器则是实现这个依赖注入模式的工具

对比 传统编写代码的方式 和 依赖注入的 区别

传统编写方式
  • 应用需要 Foo 类:
  • 应用创建 Foo:
  • 应用调用 Foo:
    • Foo 依赖 Bar
    • Foo 创建 Bar
    • Foo 调用 Bar
      • Bar 依赖 Bim
      • Bar 创建 Bim
      • Bar 做一些事情
使用依赖注入方式
  • 应用需要 Foo, Foo 需要 Bar, Bar 需要Bim:
  • 应用创建 Bim
  • 应用创建 Bar 并且把 Bim 传递给 Bar
  • 应用创建 Foo 并且把 Bar 传递给 Foo
  • 应用调用 Foo
    • Foo 调用 Bar
      • Bar 做一些事情

上面说的是一种叫做 控制反转 的模式。就是是调用者和被调用者的依赖反过来。

这样做的好处是,我们可以自主的控制依赖的关系,并且容易替换

说了这么多,不如上代码来的实在

图片alt

图片alt

乍一看这种方式,写代码反而会更多一些,毕竟以前我们只需要 new 一个 Foo 就可以了,现在反而多写了几行,但是请让我们思考一下,为什么这么做,好了,我继续说吧,我个人理解这么做的原因是,方便我们做一些替换,是我们能够减少代码的修改,比如以前 Bar 我们就当做一个发送邮件的服务,以前我们不想发送邮件了,想改用发送短信的方式,那么我们就得修改Foo的代码了,那么采用依赖注入有什么好处,我们在外面实例化Bar的时候就实例为短信服务就好了,Foo完全不用修改了,也减少我们修改多个代码的风险。这里又得多说几句了,一般在构造的时候参数大都是一个接口,然后各个服务实现接口的方法,完成各自的功能。

最后说一下使用容器的方法

  • 应用需要 Foo
  • 应用从容器中获取 Foo
    • 容器创建 Bim
    • 容器创建 Bar 并且把 Bim 传递给 Bar
    • 容器创建 Foo 并且把 Bar 传递给Foo
  • 应用调用 Foo
    • Foo 调用 Bar
      • Bar 做一些事情

其实使用容器的一个好处就是方便我们管理所有的依赖项,毕竟集中管理要比分散在代码各处要靠谱的多,但是上面说的容器,其实还有个自动分析依赖的功能,但是有一些容器并不具备这个功能,比如以前我们分析过的 Pimple 。 pimple这个东西真的就是一个容器,我们把需要的东西放置进去就好了。至于依赖什么的自己提前编排好,就ok了。不自动分析的好处是快,坏处嘛就是可能得多写一些代码。

好,今天就到这,感觉有些东西没有说清楚,不要急,不要急。以后还有