什么是动态语言中依赖注入的真实示例?

时间:2012-12-14 11:26:12

标签: python .net ruby dependency-injection angularjs

我有.NET的全面背景,但最近一直在使用Python和Ruby。我发现自己在思考如何最好地为Ruby中需要它们的对象提供依赖。

起初我认为,由于动态语言的宽松(重新定义,混合,存根等),我实际上并不认为DI和IoC框架需要与依赖项进行交互。然而,然而,我在动态语言中遇到了为什么DI / IoC框架不需要的答案。提供的理由与我不太相配。我希望我能看到一个可以解决问题的例子。

我不同意的推荐建议:

原因1:可以在运行时更改依赖类(思考测试)

Why are IOC containers unnecessary with dynamic languages中,我们看到一个依赖类(非注入),比如X,可以在测试中被存根或模拟。当然,但这要求我们知道我们的System Under Test取决于名为X的内容。如果我们System Under Test突然依赖于N而不是X,我们现在必须记住模仿N而不是X。使用DI的好处是我们永远不会意外地运行具有生产依赖性的测试,因为我们总是传递模拟的依赖项。

原因2:子类或使用构造函数注入进行测试

在每个人最喜欢的所有事物DI + Ruby,LEGOs, Play-Doh, and Programming的goto资源中,我们看到了一个将受测试系统子类化为模拟依赖项的示例。或者,我们可以使用构造函数注入。好的,B取决于A。我们致电B.get_dependency,为B提供A的实例。但是如果A取决于依赖于N的{​​{1}},会怎样?我们必须在链中的每个连续对象上调用X吗?

原因3:依赖关系可以混合或monkeypatched

Fabio mentions我们可以使用mixins / monkeypatch。因此,get_dependencyX混合。但问题是N取决于X取决于A的情况?我们只是将mixins用于链中的每个依赖吗?我知道它是如何工作的,但它可能会很快变得混乱和混乱。


附注:Many users say动态语言中不需要DI框架。然而,Angular.JS确实从实施一个非常可靠的DI系统中受益。 Angular基于JavaScript,一种动态语言。这种方法可以与Ruby或Python相媲美吗?

请记住,我并不是说我想强制 DI / IoC进入Ruby,Python等。

1 个答案:

答案 0 :(得分:2)

虽然许多人认为不需要DI,但我同意你的观点,确实需要很多;但有时它会与Python提供的其他技术混合在一起。我建议你看看venusian,它可能有点冗长,但如果你来自.NET,你会看到这种关系。总而言之:venusian允许您在不改变行为的情况下注释您的方法。因此,您可以编写venusian装饰器,以便您的单元测试不会受到影响。例如,Pyramid使用venusian来注释视图。