当前位置: 首页 > 知识库问答 >
问题:

为什么要使用依赖注入?

柯英奕
2023-03-14

我不太明白它解决了什么问题。它看起来像是这样说:“Hi.当你运行到这个函数时,返回一个对象,它是这种类型的,并且使用这些参数/数据。”
但是...我为什么要用这个?注我也从来不需要使用object,但我理解这是为了什么。

在构建一个网站或桌面应用程序时,有哪些实际情况可以使用DI?我可以很容易地想出为什么有人想在游戏中使用接口/虚拟函数的例子,但是在非游戏代码中使用这种方法是极其罕见的(非常罕见,以至于我都记不住一个实例了)。

共有1个答案

平俊茂
2023-03-14

首先,我想解释我为这个答案所做的一个假设。这并不总是正确的,但经常是这样的:

接口是形容词;类是名词。

(其实也有接口是名词,但我想在这里概括一下。)

var logger = new Logger();

当然,您不希望更改所有代码(同时您有大量代码)并替换所有行

var logger = new Logger();

由:

var logger = new TcpLogger();

首先,这一点都不好玩。第二,这是容易出错的。第三,对一只训练有素的猴子来说,这是愚蠢的重复工作。那你是做什么的?

ICanLog logger = new Logger();
ICanLog logger = LoggerFactory.Create();
ICanLog logger = TypeFactory.Create<ICanLog>();

为您提供一个有用的例子:假设一个软件不正常记录,但当您的客户因为有问题而打电话请求帮助时,您发送给他的只是一个更新的XML配置文件,现在他已经启用了日志记录,您的支持人员可以使用日志文件来帮助您的客户。

现在,当您稍稍替换名称时,您将得到一个简单的服务定位器实现,这是两种反转控制html" target="_blank">模式之一(因为您反转了由谁决定实例化什么确切类的控制)。

总之,这减少了代码中的依赖关系,但现在您的所有代码都依赖于中心的、单一的服务定位器。

依赖注入现在是这一行的下一个步骤:只需摆脱对服务定位器的单一依赖关系:不再是各种类向服务定位器请求特定接口的实现,而是您--再一次--恢复对谁实例化什么的控制。

通过依赖项注入,您的数据库类现在有一个构造函数,该构造函数需要ICANLOG类型的参数:

public Database(ICanLog logger) { ... }

现在您的数据库总是有一个记录器要使用,但它不知道这个记录器从何而来。

因此,长话短说:依赖项注入是如何在代码中删除依赖项的两种方法之一。它对于编译后的配置更改非常有用,对于单元测试也是一件很好的事情(因为它使得注入存根和/或模拟变得非常容易)。

在实践中,有些事情没有服务定位器是无法完成的(例如,如果您事先不知道特定接口需要多少实例:DI框架总是每个参数只注入一个实例,但您当然可以在循环中调用服务定位器),因此每个DI框架通常也提供一个服务定位器。

但基本上就是这样。

 类似资料:
  • 问题内容: 已经发布了几个问题,其中包括有关依赖项注入的特定问题,例如何时使用它以及支持它的框架。然而, 什么是依赖项注入?何时/为什么/不应该使用它? 问题答案: 依赖注入 将依赖传递给其他 对象 或 框架 (依赖注入器)。 依赖注入使测试更加容易。注入可以通过 构造函数 完成。 其构造函数如下: 问题 :如果涉及复杂的任务,例如磁盘访问或网络访问,则 很难 对其进行单元测试。程序员必须进行模拟

  • 我已经开始涉足ASP. Net Core,并发现依赖注入是ASP. Net Core框架中的一流公民,它是内置的,可以用于注入各种服务和库。 我想知道他们正在使用哪个依赖注入框架。他们的文档介绍了ASP中的依赖项注入。网芯 ASP。NET Core从一开始就被设计为支持和利用依赖注入。ASP。NET核心应用程序可以通过将内置框架服务注入Startup类中的方法来利用这些服务,应用程序服务也可以配置

  • 考虑下面的代码: 上面的代码是一个表示一个汉堡包类。 该类假设汉堡包括Bun, Patty 和 Toppings。 该类还负责制作Bun, Patty 和 Toppings。 这是一件坏事。 如果需要素食汉堡怎么办? 一个天真的方法可能是: 好吧,这有点不同,它在某些方面更灵活,但它仍然相当脆弱。 如果Patty构造函数改变以允许新的功能会发生什么? 整个汉堡包类必须更新。 事实上,任何时候任何这

  • 我们刚刚升级到的新版本的Spring Boot和liquibase自动配置给我们带来了一些问题,它失败了,因为它正在寻找一个不存在的liquibase文件来加载,我们过去已经使用我们自己编写的运行程序完成了liquibase配置,这些运行程序使用了不同的结构。 无论如何,有一些潜在的修复方法,其中之一是简单地禁用liquibaseAutoConfiguration类的运行。我不认为我们需要 bea

  • 嗨, 我是Spring boot gradle项目的新手。我正在尝试用Spring boot应用程序运行flyway迁移。这就是我在gradle中设置依赖项的方式, 首先,我将依赖项添加为。这足以暴露一个终点。 然后我尝试以的方式添加flyway依赖项,它既没有抛出错误,也没有运行迁移脚本,直到我添加了依赖项。在查看了data-jpa jar的pom.xml之后,我确定了这个jar的hiberna

  • 问题内容: 我认为Maven依赖关系的顺序之前无关紧要,并认为这是它的一个优点。这是我以前的依赖项: 它运作良好,今天我要把对弹簧的依赖移到最底层,以便与那些球衣相关的东西可以在一起。但是后来我再也无法正常工作了,我的码头抱怨道: 那真的很令人困惑,所以我是否需要考虑依赖顺序?我怎么知道正确的顺序? 问题答案: 依赖关系的顺序确实很重要,因为从2.0.9版开始,Maven如何解决传递依赖关系。文档