相关疑难解决方法(0)

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

我有一个完整的.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等.

.net ruby python dependency-injection angularjs

14
推荐指数
1
解决办法
1665
查看次数

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

为了编写可测试的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,根本不需要.

有什么建议吗?

dependency-injection dynamic-languages

12
推荐指数
2
解决办法
1943
查看次数

JavaScript DI/IoC与静态类型语言的标准DI模式等效

.NET和Java都有大量可用的DI/IoC容器,每个容器都有许多模式,我发现这些模式在处理它们的各个方面非常有用.我现在正想在JavaScript中做同等的事情.由于JavaScript是一种动态语言,我不希望DI/IoC容器直接等同于静态类型语言中的容器提供的所有功能,因此欢迎使用这些模式的替代方案.我还希望JavaScript中提供的DI/IoC容器的功能会有所不同,因此对不同容器的引用非常受欢迎.

以下模式是Autofac 3支持的模式,我认为这些模式适用于动态语言.有关这些模式和关系的一般信息,请参阅 http://autofac.readthedocs.org/en/latest/resolve/relationships.htmlhttp://nblumhardt.com/2010/01/the-relationship-zoo/.以下概念中的大多数(如果不是全部)也可以使用其他语言和DI/IoC容器,例如Google GuiceSpring.

与JavaScript中下面描述的概念和模式最接近的等价物是什么?

一般概念

概念1:向IoC容器注册

在IoC容器可以创建类型的实例之前,它需要知道类型.这是通过注册完成的.注册通常以声明方式完成:

class A {}
var builder = new ContainerBuilder();
builder.RegisterType<A>();
Run Code Online (Sandbox Code Playgroud)

上面使IoC容器知道类型A.它通过反射发现A的依赖性.注册也可以通过充当工厂的功能进行.这些函数通常是lambdas,可以内联编写:

class B {}
class A {
    A(string name, B b) { }
}
builder.RegisterType<B>();
builder.Register(c => // c is a reference to the created container
    new A("-name-", c.Resolve<B>()));
Run Code Online (Sandbox Code Playgroud)

当您的类型需要使用不是服务的依赖项(例如上面示例中的名称)进行参数化时,能够提供工厂函数特别有用.

由于C#支持接口和抽象类,因此它通常不是重要的具体数据类型,而是它实现的抽象类型.在这些情况下,您将该类型注册为应该可用的接口或抽象类:

interface IPlugin {}
class P : IPlugin
builder.RegisterType<P>().As<IPlugin>();
Run Code Online (Sandbox Code Playgroud)

通过上面的注册,任何请求a的尝试P都会失败,但是对a的请求IPlugin会成功.

概念2:容器创建和组合根

完成所有注册后,需要创建容器:

public class Program {
    public …
Run Code Online (Sandbox Code Playgroud)

javascript c# dependency-injection inversion-of-control autofac

7
推荐指数
1
解决办法
452
查看次数

Ioc容器和动态语言(取2)

我一直在阅读依赖注入,控制反转和IoC容器.我还主要使用动态语言编程(PHP在工作,Python在家).以下是我找到的东西,但是当我把它拼凑在一起时,这给我留下了很多空白:

所以我读到的是:IoC容器在静态语言中是一个更大的交易,因为在动态语言中执行DI要容易得多.但是它们还提供了远远超出DI的好处,比如为您管理依赖项,并使您不必手动将十几个对象串联起来.顺便说一句,它们很复杂,所以不要自己尝试(但PHP没有好的).

我觉得这些信息让我有点......卡住了.我该怎么办?我在一个非常大的代码库中工作,具有非常复杂的依赖(并且可能强烈需要重构,但这是另一个并行问题).到目前为止,我们在实施DI方面做得很差,我真的想让我们朝着正确的方向前进.关于动态语言和IoC(或至少IoC容器)似乎没有什么.

我最好暂时将"依赖于手工"的依赖关系放在一起,并且在我更好地处理这些原则之后,担心稍后在容器中自动化它?是否值得实现我自己的简单IoC容器?或者最终是不值得PHP的成本?

php dependency-injection ioc-container dynamic-typing

5
推荐指数
1
解决办法
1141
查看次数