问题标签 [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.
unit-testing - 具有文件系统依赖性的单元测试代码
我正在编写一个组件,给定一个 ZIP 文件,它需要:
- 解压缩文件。
- 在解压缩的文件中查找特定的 dll。
- 通过反射加载该 dll 并在其上调用方法。
我想对这个组件进行单元测试。
我很想编写直接处理文件系统的代码:
但是人们经常说,“不要编写依赖文件系统、数据库、网络等的单元测试。”
如果我以对单元测试友好的方式编写它,我想它看起来像这样:
耶!现在它可以测试了;我可以将测试替身(模拟)输入 DoIt 方法。但代价是什么?我现在必须定义 3 个新接口才能使其可测试。我到底在测试什么?我正在测试我的 DoIt 函数是否与其依赖项正确交互。它不会测试 zip 文件是否已正确解压缩等。
感觉我不再在测试功能了。感觉就像我只是在测试课堂互动。
我的问题是:对依赖于文件系统的东西进行单元测试的正确方法是什么?
编辑我正在使用 .NET,但这个概念也可以应用 Java 或本机代码。
design-patterns - 什么是依赖注入?
已经发布了几个关于依赖注入的特定问题的问题,例如何时使用它以及有哪些框架可供使用。然而,
什么是依赖注入以及何时/为什么应该或不应该使用它?
php - PHP4 有依赖注入框架吗?
我被困在 PHP 4 服务器上,我想开始将旧的遗留项目迁移到现代设计模式,包括依赖注入。是否有适用于 PHP 4 的依赖注入框架?
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 配置的目的而不是初始化代码 - 我倾向于认为初始化代码更短更清晰。到目前为止,我对我的问题的唯一答案是,当配置更改时,它可以避免重新编译。我想我应该发布另一个问题,因为这对我来说是一个很大的秘密,为什么在这种情况下应该避免编译。
dependency-injection - Castle-Windsor 运行时交换服务
假设我们将税务服务的接口定义为 ITaxService,并且我们获得了多个 TaxService 的实现(按地区),但是我想将特定的税务实现附加到来自特定地区的特定客户。
DI 在这种情况下会有所帮助吗?如何?“代码片段将不胜感激”
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
c# - 如何将对象而不是类型传递给 Windsor 容器?
我有以下课程:
这是演示者代码:
我想将当前实例传递ViewPage
给TPresenter
viaWindsor
而不是让它实例化一个新对象。我怎样才能做到这一点?谢谢。
.net - 我应该使用哪个依赖注入工具?
我正在考虑在我们的用户界面中将 Microsoft Unity 用于我的依赖注入工具。
我们的中间层已经在使用 Castle Windsor,但我认为我应该坚持使用 Microsoft。
有人对最好的依赖注入工具有什么想法吗?
- 自动法
- 城堡微内核/温莎
- PicoContainer.NET
- 拼图.NFactory
- 春天.NET
- 结构图
- 忍者
- 统一
- 简单的喷油器
- NauckIT.微内核
- WINTER4NET
- 对象构建器
python - Python 依赖注入框架
是否有与Python的 Guice ( http://code.google.com/p/google-guice ) 等效的框架?
dependency-injection - 我应该如何为 DI/IOC 订购我的 ctor 参数?
我是一个 DI 新手,如果这是错误的方法或愚蠢的问题,请原谅我。
假设我有一个创建/更新订单的表单,并且我知道它需要检索要显示的产品和客户列表。我想传入它正在编辑的 Order 对象,但我也想将 ProductsService 和 CustomersService 作为依赖项注入。
因此,我希望我的 IoC 容器(无论我使用哪个容器)来提供服务,但这取决于调用代码来提供要编辑的 Order 对象。
我是否应该将构造函数声明为将 Order 对象作为第一个参数,然后将 ProductsService 和 CustomersService 声明为,例如:
...或者依赖项应该先出现,Order 对象最后,例如:
有关系吗?这是否取决于我使用的 IoC 容器?或者,还有更好的方法?