问题标签 [dependency-injection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
52145 浏览

unit-testing - 具有文件系统依赖性的单元测试代码

我正在编写一个组件,给定一个 ZIP 文件,它需要:

  1. 解压缩文件。
  2. 在解压缩的文件中查找特定的 dll。
  3. 通过反射加载该 dll 并在其上调用方法。

我想对这个组件进行单元测试。

我很想编写直接处理文件系统的代码:

但是人们经常说,“不要编写依赖文件系统、数据库、网络等的单元测试。”

如果我以对单元测试友好的方式编写它,我想它看起来像这样:

耶!现在它可以测试了;我可以将测试替身(模拟)输入 DoIt 方法。但代价是什么?我现在必须定义 3 个新接口才能使其可测试。我到底在测试什么?我正在测试我的 DoIt 函数是否与其依赖项正确交互。它不会测试 zip 文件是否已正确解压缩等。

感觉我不再在测试功能了。感觉就像我只是在测试课堂互动。

我的问题是:对依赖于文件系统的东西进行单元测试的正确方法是什么?

编辑我正在使用 .NET,但这个概念也可以应用 Java 或本机代码。

0 投票
38 回答
999878 浏览

design-patterns - 什么是依赖注入?

已经发布了几个关于依赖注入的特定问题的问题,例如何时使用它以及有哪些框架可供使用。然而,

什么是依赖注入以及何时/为什么应该或不应该使用它?

0 投票
3 回答
539 浏览

php - PHP4 有依赖注入框架吗?

我被困在 PHP 4 服务器上,我想开始将旧的遗留项目迁移到现代设计模式,包括依赖注入。是否有适用于 PHP 4 的依赖注入框架?

0 投票
16 回答
29788 浏览

xml - 依赖注入容器有什么好处?

我了解依赖注入本身的好处。让我们以 Spring 为例。我也了解其他 Spring 特性的好处,如 AOP、不同类型的助手等。我只是想知道,XML 配置有什么好处,例如:

与普通的旧 java 代码相比,例如:

这更容易调试,编译时间检查,任何只知道java的人都可以理解。那么依赖注入框架的主要目的是什么?(或一段显示其好处的代码。)


更新:
如果

如果有多个,IoC 框架如何猜测我要注入的 myService 的哪个实现?如果给定接口只有一个实现,并且我让 IoC 容器自动决定使用它,那么在出现第二个实现后它将被破坏。而且,如果故意只有一种可能的接口实现,那么您不需要注入它。

看到 IoC 的一小部分配置显示它的好处会非常有趣。我使用 Spring 已经有一段时间了,我无法提供这样的例子。我可以展示单行代码来展示我使用的 hibernate、dwr 和其他框架的好处。


更新 2:
我意识到可以在不重新编译的情况下更改 IoC 配置。这真的是个好主意吗?我可以理解何时有人想要更改数据库凭据而不重新编译 - 他可能不是开发人员。在您的实践中,开发人员以外的其他人多久更改一次 IoC 配置?我认为对于开发人员而言,无需重新编译该特定类而不是更改配置。对于非开发人员,您可能希望让他的生活更轻松并提供一些更简单的配置文件。


更新 3:

接口及其具体实现之间映射的外部配置

让它外接有什么好处?您不必将所有代码都放在外部,虽然您绝对可以 - 只需将其放在 ClassName.java.txt 文件中,即时手动读取和编译 - 哇,您避免了重新编译。为什么要避免编译?!

您可以节省编码时间,因为您以声明方式提供映射,而不是在程序代码中

我知道有时声明性方法可以节省时间。例如,我只声明一次 bean 属性和 DB 列之间的映射,hibernate 在加载、保存、构建基于 HSQL 的 SQL 等时使用此映射。这就是声明性方法的工作原理。在 Spring 的情况下(在我的示例中),声明有更多的行并且与相应的代码具有相同的表现力。如果有这样的声明比代码短的例子 - 我想看看。

控制反转原则允许简单的单元测试,因为您可以用假的实现替换真实的实现(比如用内存中的替换 SQL 数据库)

我确实理解控制反转的好处(我更喜欢将这里讨论的设计模式称为依赖注入,因为 IoC 更通用 - 有多种控制,我们只反转其中一种 - 初始化控制)。我在问为什么有人需要编程语言以外的东西。我绝对可以使用代码用假的实现替换真实的实现。这段代码将表达与配置相同的内容——它只会用假值初始化字段。

我确实了解 DI 的好处。我不明白与配置相同的代码相比,外部 XML 配置有什么好处。我认为不应该避免编译——我每天都在编译,而且我还活着。我认为 DI 的配置是声明性方法的坏例子。如果声明一次并且以不同的方式多次使用,则声明可能很有用 - 例如 hibernate cfg,其中 bean 属性和 DB 列之间的映射用于保存、加载、构建搜索查询等。Spring DI 配置可以很容易地转换为配置代码,就像在这个问题的开头一样,不能吗?而且它仅用于 bean 初始化,不是吗?这意味着声明性方法不会在此处添加任何内容,是吗?

当我声明hibernate映射时,我只是给hibernate一些信息,它基于它工作——我不告诉它做什么。在春天的情况下,我的声明告诉春天到底要做什么——那么为什么要声明它,为什么不直接去做呢?


最后更新:
伙计们,很多答案都在告诉我有关依赖注入的信息,我知道这很好。问题是关于 DI 配置的目的而不是初始化代码 - 我倾向于认为初始化代码更短更清晰。到目前为止,我对我的问题的唯一答案是,当配置更改时,它可以避免重新编译。我想我应该发布另一个问题,因为这对我来说是一个很大的秘密,为什么在这种情况下应该避免编译。

0 投票
1 回答
366 浏览

dependency-injection - Castle-Windsor 运行时交换服务

假设我们将税务服务的接口定义为 ITaxService,并且我们获得了多个 TaxService 的实现(按地区),但是我想将特定的税务实现附加到来自特定地区的特定客户。

DI 在这种情况下会有所帮助吗?如何?“代码片段将不胜感激”

0 投票
3 回答
1050 浏览

dependency-injection - taglib -> dependency injection pojo/service how?

Is there a nice way to dependency inject using a jsp taglib?

either using ejb 3.0, spring, or guice...

I have a lot of services/pojos that I would like to use in my taglibs

0 投票
0 回答
433 浏览

c# - 如何将对象而不是类型传递给 Windsor 容器?

我有以下课程:

这是演示者代码:

我想将当前实例传递ViewPageTPresenterviaWindsor而不是让它实例化一个新对象。我怎样才能做到这一点?谢谢。

0 投票
9 回答
14783 浏览

.net - 我应该使用哪个依赖注入工具?

我正在考虑在我们的用户界面中将 Microsoft Unity 用于我的依赖注入工具。

我们的中间层已经在使用 Castle Windsor,但我认为我应该坚持使用 Microsoft。

有人对最好的依赖注入工具有什么想法吗?

0 投票
18 回答
37284 浏览

python - Python 依赖注入框架

是否有与Python的 Guice ( http://code.google.com/p/google-guice ) 等效的框架?

0 投票
4 回答
648 浏览

dependency-injection - 我应该如何为 DI/IOC 订购我的 ctor 参数?

我是一个 DI 新手,如果这是错误的方法或愚蠢的问题,请原谅我。

假设我有一个创建/更新订单的表单,并且我知道它需要检索要显示的产品和客户列表。我想传入它正在编辑的 Order 对象,但我也想将 ProductsService 和 CustomersService 作为依赖项注入。

因此,我希望我的 IoC 容器(无论我使用哪个容器)来提供服务,但这取决于调用代码来提供要编辑的 Order 对象。

我是否应该将构造函数声明为将 Order 对象作为第一个参数,然后将 ProductsService 和 CustomersService 声明为,例如:

...或者依赖项应该先出现,Order 对象最后,例如:

有关系吗?这是否取决于我使用的 IoC 容器?或者,还有更好的方法?