我有.NET的全面背景,但最近一直在使用Python和Ruby。我发现自己在思考如何最好地为Ruby中需要它们的对象提供依赖。
起初我认为,由于动态语言的宽松(重新定义,混合,存根等),我实际上并不认为DI和IoC框架需要与依赖项进行交互。然而,然而,我在动态语言中遇到了为什么DI / IoC框架不需要的答案。提供的理由与我不太相配。我希望我能看到一个可以解决问题的例子。
在Why are IOC containers unnecessary with dynamic languages中,我们看到一个依赖类(非注入),比如X
,可以在测试中被存根或模拟。当然,但这要求我们知道我们的System Under Test
取决于名为X
的内容。如果我们System Under Test
突然依赖于N
而不是X
,我们现在必须记住模仿N
而不是X
。使用DI的好处是我们永远不会意外地运行具有生产依赖性的测试,因为我们总是传递模拟的依赖项。
在每个人最喜欢的所有事物DI + Ruby,LEGOs, Play-Doh, and Programming的goto资源中,我们看到了一个将受测试系统子类化为模拟依赖项的示例。或者,我们可以使用构造函数注入。好的,B
取决于A
。我们致电B.get_dependency
,为B
提供A
的实例。但是如果A
取决于依赖于N
的{{1}},会怎样?我们必须在链中的每个连续对象上调用X
吗?
Fabio mentions我们可以使用mixins / monkeypatch。因此,get_dependency
与X
混合。但问题是N
取决于X
取决于A
的情况?我们只是将mixins用于链中的每个依赖吗?我知道它是如何工作的,但它可能会很快变得混乱和混乱。
附注:Many users say动态语言中不需要DI框架。然而,Angular.JS确实从实施一个非常可靠的DI系统中受益。 Angular基于JavaScript,一种动态语言。这种方法可以与Ruby或Python相媲美吗?
请记住,我并不是说我想强制 DI / IoC进入Ruby,Python等。