|
|
1
50
IoC提供了一种机制,当一个对象在另一个类上调用“new”时,可以打破耦合。这种耦合将调用对象与它实现的任何接口的实例化实现联系起来。
在静态语言中按名称引用类时(调用
在动态语言中调用
这种微妙的差异意味着在动态语言中,您通常可以改变
然而,就我个人而言,我发现IoC有两个优势,那就是依靠动态语言来允许注入是无法实现的。 通过构造函数传递依赖项的一个副作用是,最终得到的“构建块”类非常解耦、可重用且易于测试。他们不知道要在什么上下文中使用它们,所以你可以到处重用它们。
就像Jrg W Mittag说的。。 |
|
|
2
27
我有不同的意见。我认为IOC容器在动态语言中肯定有作用。 我不同意这样的观点,即语言是动态的,不需要对象的结构清晰的组合。或者动态语言“提供”相同的功能。
即使在动态语言中,我也希望将组件“连接”在一起。不需要在这些组件之间建立严格的依赖关系。或者甚至不指定这些组件的实际实现类。 |
|
|
3
20
我同意上面的答案,但我想我也应该在这里插一点关于测试的内容: 在子系统之间存在交互的复杂系统中,依赖注入是我所知道的进行单元测试的最佳方法。
应该有两种测试:
:
现在,我们为什么不在许多动态语言中看到国际奥委会? 我想说的原因是我们在这些语言中没有看到太多依赖注入。 …那是因为在他们身上做的测试通常是不存在的。
有 没有借口 对于没有单元测试或代码覆盖率低的单元测试的项目。
guice网站上有一篇关于DI的优秀文章: http://code.google.com/p/google-guice/wiki/Motivation 动态语言并不能解决这些问题。
|
|
|
4
17
因为它们已经融入了语言。 IoC容器提供两种功能:
动态绑定已经是动态语言的一部分,而动态语言已经是一种动态语言。因此,IoC容器根本没有意义:语言已经是IoC容器了。
请注意我是 谈论依赖注入或控制反转。DI和IoC是 因为完全相同的原因,动态语言和静态语言一样重要。我说的是IoC容器和DI框架。那些 是不必要的 设计原则 |
|
5
4
这是对国际奥委会的天真看法。通常,IoC还解决:
|
|
6
4
我相信IoC容器在大型JavaScript应用程序中是必要的。您可以看到一些流行的JavaScript框架包括一个IoC容器(例如
我已经开发了一个名为InversifyJS的IoC容器,您可以在 http://inversify.io/ . 一些JavaScript IoC容器声明要注入的依赖项如下:
这种方法的优点是没有字符串文字。不好的是,我们的目标是实现解耦,我们只是添加了一个 到文件中的忍者是宣布,这不是真正的解耦。 InversifyJS为您提供真正的解耦。ninja.js文件永远不会指向katana或shuriken文件。但是,它将指向接口(在设计时)或字符串文本(在运行时),这是可以接受的,因为它们是抽象和 depending upon abstractions 这就是DI的意义所在。
js内核是应用程序中唯一知道生命周期和依赖关系的元素。我们建议在名为
这意味着
应用程序中的所有耦合都发生在一个独特的位置
:的
要付出的代价是字符串文本,但如果在包含常量的文件中声明所有字符串文本,则可以降低此代价( like actions in Redux ). 好消息是在将来 could end up being generated by the TS compiler ,但这目前掌握在TC39委员会手中。 here . |
|
|
7
3
this article 换个角度。 |
|
|
8
3
这个合成层在动态语言(如Python或Javascript)中相对自然地存在(考虑Javascript在很大程度上基于Scheme)。 您可能会提出一个很好的论点,即IoC容器只是解释器模式的泛化。 |
|
|
9
0
Herding Code 82 (6/6/10)比较了Ruby和.NET,并详细讨论了.NET比Ruby需要更多IOC/DI的程度。 |