在动态语言中是否需要依赖注入?

Fin*_*las 12 dependency-injection dynamic-languages

为了编写可测试的C#代码,我大量使用DI.

然而,最近我一直在搞乱IronPython并发现你可以模拟任何方法/类/函数等...你喜欢,对DI的需求已经消失.

这是Python等动态联盟的情况吗?

代替:

class Person(Address) {
...
Run Code Online (Sandbox Code Playgroud)

你可以有:

class Person() {
...
    // Address initialised in here.
Run Code Online (Sandbox Code Playgroud)

对于动态语言,因此根据动态联盟的manaual DI,根本不需要.

有什么建议吗?

Ale*_*vik 10

依赖注入也是关于如何将事物连接在一起的 - 这与依赖对象的可模拟性无关.拥有Foo需要某种类型的Bar连接的-instance 直接实例化它并且让它完全忽略它如何获得该连接只要有它就有区别.

如果使用依赖注入,您可以获得更好的可测试性.但反过来却不是这样.通过能够覆盖任何东西来简化可测试性并不会带来依赖注入的其他优点.由于这些原因,Python有许多组件/ DI框架可用.


Jör*_*tag 10

我非常不同意您在动态类型语言中不需要依赖注入的说法.DI有用和必要的原因完全独立于语言的输入规则.

主要区别在于动态类型语言中的DI简单易行:您不需要重量级框架和大量XML配置.

例如,在Ruby中,只有两个DI框架.两者都是由Java程序员编写的.单个项目都不使用这两个框架.这些框架的作者甚至都没有.

但是,DI在Ruby中被广泛使用.

Jamis Buck是这两个框架的作者,他在RubyConf 2008上发表了一篇名为" 从企业恢复"的演讲,讲述了他编写这些框架的方式和原因以及为什么这是一个坏主意,值得关注.如果您想阅读,还有一篇随附的博客文章.(每当他说"Ruby"时,只需用"Python"代替,所有内容都同样有效.)

  • 难道"gazillion"不夸张吗?我在C#中大量使用DI,并且我使用非常少的XML配置(如果有的话). (2认同)
  • 另一种思考方式:DI框架有什么作用?它将独立组件粘合在一起.我们通常称之为将独立组件粘合在一起?脚本!它是如何决定做什么的?它读取XML文件或一组注释.我们通常会将一组指令称为如何将事物粘合在一起?一个脚本!执行这些指令的是脚本解释器.因此,DI框架只是一个(通常非常糟糕,尤其是在使用XML时)脚本语言的解释器.但是在Python中我们*已经*拥有:Python! (2认同)