采访者问道:“依赖注入的价值是什么?”

Interviewer asks: “What's the value of dependency injection?”

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is dependency injection?

我回答说:"你不需要使用new操作符。"

采访者的回答:"。就是这样?"

这就是我能想到的。

如果回答不正确,会有什么更正确的回答?


它将组件与其外部依赖项(如其他库、数据库等)分离,从而允许您轻松地更改它们,即使在运行时也是如此。

例如,这在自动化测试中很有用,因为您可以通过公共API注入模拟对象。


依赖注入将类与它们所依赖的服务分离,允许您一次注册一组服务,并在整个代码库中使用它们。

这允许您无干扰地切换实现,特别是在实现经过单元测试的情况下。

它还允许您为不同的用例(如Web与GUI与测试)使用相同的类来放置不同的服务实现。


与其用"依赖注入"这个词来思考,不如想想"工厂列表"。用一个现实世界的例子,想想一家目录供应公司,有成千上万种不同的产品。它希望使用一个通用的方案来保持对象在库存中,并在空的时候对其重新排序。如果每种产品都有自己独立的订购方式,而且必须有一个人知道如何订购每种产品,那么经营这样一家企业就很困难了。然而,这不是企业的运作方式。相反,将有一个文件,其中包含每种产品订购所需的信息和程序。许多产品都会使用相同的程序,但有些产品可能需要特殊的程序(例如,在下午2点到3点之间致电815-555-6666,询问Steve,并询问他是否有带蓝色端盖的小部件,因为公司通常会戴黄色端盖)。

把依赖注入看作是在产品类型列表中包含采购指令的能力。想想这个目录公司有这样的能力运作是多么的顺利,想一个没有它的任何规模的公司是多么的尴尬。

ps--"依赖注入",比如"资源分配就是初始化",是一个我不喜欢的短语,因为它的实际意义与构成它的词几乎没有关系。DI的大多数用途似乎与"依赖性"没有多大关系,也与"注入"没有多大关系。我认为"工厂名单"是一个较长的词(但音节较短),它能更好地传达意义。顺便说一句,对于RIAA,我将用"对象生存期匹配对象范围"代替。


维基百科的文章是一个很好的参考:http://en.wikipedia.org/wiki/dependency_injection。

主要是减少耦合,简化测试。您可以方便地对类进行单元测试,只需向它提供一个模拟而不是真正的类。在面试中,这是一个很好的问题,看候选人是否熟悉TDD良好实践。