依赖注入学习笔记(二)深入浅出依赖注入

学习资料来源:https://learnku.com/articles/10928/deep-inflow-of-dependency-injection

1、什么是「组件」和「服务」

所谓的「依赖」就是指在实现某个功能模块时需要使用另外一个(或多个)「组件」或「服务」,那么这个所需的「组件」或「服务」将被称为「依赖」。

「组件」:它是可能被作者无法控制的其它应用使用,但使用者不能对其源码进行修改的一个功能模块。

「服务」指:使用者以同步(或异步)请求远程接口来远程使用的一个功能接口。

「组件」和「服务」的 共同之处:就是它们都将被其他应用程序或功能模块使用。

它们的不同之处在于:

  • 「组件」是在本地使用(如 jar 文件、dll 或者源码导入)
  • 「服务」是在远程使用(如 WebService、消息系统、RPC 或者 Socket)

2、什么是控制反转和依赖注入?

控制反转定义:
「控制反转」提供了将「插件」组合进模块的能力。 在实现「控制反转」过程中我们「反转」了哪方面的「控制」呢?其实这里的「反转」的意义就是 如何去定位「插件」的具体实现。
采用「控制反转」模式时,我们通过一个组装模块,将「插件」的具体实现「注入」到模块中就可以了。

个人理解:

这有点像实现类的多态,组件的多态么?

依赖注入的目标:

「依赖注入」就是为了完成这样的 目标:将 依赖组件 的配置和使用分离开,以降低使用者与依赖之间的耦合度。

依赖注入的定义:

应用程序对需要使用的依赖「插件」在编译(编码)阶段仅依赖于接口的定义,到运行阶段由一个独立的组装模块(容器)完成对实现类的实例化工作,
并将其「注射」到应用程序中称之为「依赖注入」。

个人理解:

这感觉是面向接口开发???定义好接口,只要注入的依赖组件依赖该接口便可以实现注入。

3、什么是依赖注入容器


上面实现依赖注入的过程仅仅可以当做一个演示,真实的项目中肯定没有这样使用的。那么我们在项目中该如何去实现依赖注入呢?

看到上面这句话。老子信了你的邪。我好像就是这样做的。

定义:

由一个独立的组装模块(容器)完成对实现类的实例化工作,那么这个组装模块就是「依赖注入容器」。

<?php
class Container
{
    public function getStorage()
    {
        return new SessionStorage();
    }

    public function getUser()
    {
        $user = new User($this->getStorage());
        return $user;
    }
}
//调用
$container = new Container();
$user = $container->getUser();

思考:如何将实现类相关数据写入到配置文件中,并在容器中实例化从配置文件中读取。

个人理解:可以利用框架的服务器容器,使用自己创建的组件,这时候就要去看框架的服务器容器的使用,和创建组件规则了。学习学习。

4、依赖注入的优缺点

选择通过构造函数注入:

  • 能够在构造阶段就创建完整、合法的对象;
  • 带有参数的构造子可以明确地告诉你如何创建一个合法的对象;
  • 可以隐藏任何不可变的字段。

选择通过 setter 设值方法注入:

  • 如果依赖的「插件」太多时,选择设值注入更优

个人理解:

很高大上,只求会使用,想要设计可能要有成熟的框架思想。

原文地址:https://www.cnblogs.com/jiangxiaochang/p/10906870.html