为什么使用依赖注入_依赖注入快速入门:什么是注入,什么时候使用它

【注】本文节译自:https://www.freecodecamp.org/news/a-quick-intro-to-dependency-injection-what-it-is-and-when-to-use-it-7578c84fa88f/

4b7d989d349dbfd9c5cf90ed5db67400.png

介绍

在软件工程中,依赖项注入是一种技术,通过它一个对象(或静态方法)可以提供另一个对象的依赖项。依赖项是可以使用的对象(服务)。

这是维基百科的定义,但仍然不是很容易理解。让我们来更好地了解它。

在了解它在编程中的含义之前,让我们先了解一下它的一般含义,因为它可以帮助我们更好地理解这个概念。

依赖的意思是指依靠某种东西来获得支持。就像我说过,我们对手机的依赖程度过高,这意味着我们对手机的依赖程度高。

因此,在进行依赖注入之前,首先让我们了解编程中的依赖是什么意思。

当类 A 使用类 B 的某些功能时,就说明类 A 依赖于类 B。

在 Java 中,在使用其他类的方法之前,我们首先需要创建该类的对象(即,类 A 需要创建类 B 的实例)。

因此,将创建对象的任务转移给其他人并直接使用依赖项的过程称为依赖项注入。

bf04036711733efa6eaf6aed09569ea9.png

如果代码可以说话会怎么样?

如果代码可以说话会怎么样?

为什么要使用依赖注入?

假设我们有一个汽车(Car)类,其中包含各种对象,例如 wheels (车轮),engine(引擎)等。

这里的 Car 类负责创建所有依赖项对象。现在,如果我们决定将来放弃 MRFWheels,并希望使用 Yokohama (横滨车轮),该怎么办?

我们将需要使用新的 Yokohama 依赖关系来重新创建 car 对象。但是,当使用依赖项注入(DI)时,我们可以在运行时更改 Wheels(因为可以在运行时而不是在编译时注入依赖项)。

你可以将 DI 视为代码中的中间人,他负责创建首选的 wheels 对象并将其提供给 Car 类的所有工作。

它使我们的 Car 类独立于 Wheels,Battery 等对象的创建。

基本上有三种类型的依赖项注入:

  1. 构造函数注入:依赖关系通过类构造函数提供。
  2. setter 注入:客户端公开一个 setter 方法,注入程序使用该方法注入依赖项。
  3. 接口注入:依赖项提供了一个注入器方法,该方法会将依赖项注入到传递给它的任何客户端中。 客户端必须实现一个接口,该接口公开一个接受依赖项的 setter 方法。

所以现在依赖项的注入责任是:

  1. 创建对象
  2. 了解哪些类需要这些对象
  3. 并提供所有这些对象

如果对象有任何更改,则 DI 会对其进行调查,并且它不应该涉及使用这些对象的类。这样,如果将来对象发生变化,则 DI 负责为类提供适当的对象。

控制反转-DI背后的概念

这说明一个类不应静态配置其依赖项,而应由外部的某个其他类配置。

这是 S.O.L.I.D 的第五项原则,即 Bob 叔叔 提出的面向对象编程和设计的五项基本原则,其中指出,一个类应该依靠抽象而不是依赖于具体概念(简单地说,就是硬编码)。

根据这些原则,类应该专注于履行职责,而不是创建履行职责所需要的对象。这就是依赖注入发挥作用的地方:它为类提供了必需的对象。

注意:如果您想了解 Bob叔叔 的SOLID原理,则可以转到此链接。

使用 DI 的好处

  1. 有助于单元测试
  2. 由于依赖关系的初始化是由反射器组件完成的,因此减少了硬编码。
  3. 扩展应用程序变得更加容易。
  4. 帮助实现松耦合,这在应用程序编程中很重要。

DI 的缺点

  1. 学习起来有点复杂,如果使用过度会导致管理问题和其他问题。
  2. 许多编译时错误被推到运行时。
  3. 依赖注入框架是通过反射或动态编程实现的。这可能会妨碍 IDE 自动化的使用,例如“查找引用”,“显示调用层次结构”和安全重构。

您可以自己实现依赖项注入,也可以使用第三方库或框架。

实现 DI 的库和框架

  • Spring (Java)
  • Google Guice (Java)
  • Dagger (Java 和 Android)
  • Castle Windsor (.NET)
  • Unity(.NET)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值