什么是一个动态语言中依赖注入的现实世界示例?

2024-04-25 19:02:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我对.NET有很深入的了解,但最近一直在使用Python和Ruby。我发现自己在思考如何在Ruby中最好地为需要它们的对象提供依赖关系。在

起初,我并不认为DI和IoC框架需要与依赖项交互,因为动态语言的灵活性(la重新定义、mixin、stub等)。然而,后来,我发现了为什么动态语言中不需要DI/IoC框架。我对所提供的理由不太满意。我希望我能看到一个可以澄清问题的例子。在

我有点不同意的建议:

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

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

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

在DI+Ruby所有东西的goto资源中,LEGOs, Play-Doh, and Programming,我们看到了一个例子,它将一个正在测试的系统子类化以模拟依赖关系。或者,我们可以使用构造函数注入。好的,所以B依赖于A。我们调用B.get_dependency,它为B提供一个A的实例。但是如果A依赖于N,而这个依赖于{},怎么办?我们必须对链中每个连续的对象调用get_dependency?在

原因3:依赖关系可以混合在一起,也可以是monkeypatched

Fabio mentions我们可以使用mixin/monkeypatch。所以X被混合到N。但是问题是如果X依赖于A,而{}又是什么呢?我们是否只对链下的每个依赖项使用mixin?我知道这是怎么回事,但很快就会变得混乱和混乱。在


旁注:动态语言中不需要Many users sayDI框架。然而,角度.JS已经从实现一个相当可靠的DI系统中受益匪浅。Angular是基于动态语言JavaScript构建的。这种方法与Ruby或Python相比吗?在

请记住,我不是说我想强制DI/IoC到Ruby、Python等中


Tags: 对象test框架语言关系系统动态原因
1条回答
网友
1楼 · 发布于 2024-04-25 19:02:38

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

相关问题 更多 >

    热门问题