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

Sco*_*tes 14 .net ruby python dependency-injection angularjs

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

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

推荐的建议,我有点不同意:

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

为什么IOC容器不必要的动态语言,我们看到的是一个依赖类(非注射),也就是说X,可以存根或一个测试嘲笑.当然,但这需要我们知道我们System Under Test取决于所谓的东西X.如果我们System Under Test突然依赖N而不是X,我们现在必须记住嘲笑N而不是X.使用DI的好处是我们永远不会意外地运行具有生产依赖性的测试,因为我们总是传递模拟的依赖项.

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

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

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

Fabio提到我们可以使用mixins/monkeypatch.所以X是混合的N.但问题是,如果X取决于A哪个取决于B?我们只是将mixins用于链中的每个依赖吗?我知道它是如何工作的,但它可能会变得混乱和迅速混乱.


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

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

man*_*anu 2

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