是否有任何javascript控制框架的反转?

时间:2009-09-15 04:11:49

标签: javascript inversion-of-control

javascript控制框架是否有任何反转?

我能找到的stackoverflow上最接近的答案是:What is the right way to wire together 2 javascript objects?。这看起来是一个很好的开始,但我认为我能够找到具有更长发展历史的东西。

我自己只使用Castle Windsor,而且我真的很想念它在网络客户端。

12 个答案:

答案 0 :(得分:4)

我开始写一篇我从来没有完成的作品。不确定我是否会因为开销可能不值得。如果您感兴趣,请访问:http://code.google.com/p/jasproject/wiki/JasFac(这是IoC部分,完整套件位于http://code.google.com/p/jasproject/

模拟库相当完整(虽然目前我只是在模拟/存根上使用断言但没有期望)但缺乏单元测试框架。 IoC部分相当完整但可能有一些错误(尽管不这么认为)

随意使用和/或贡献,我可以在您需要的地方提供帮助。

编辑:在jasfac的单元测试中可以看到更多用法:https://jasproject.googlecode.com/svn/trunk/Jas.Tests/JasFacTests.js

答案 1 :(得分:4)

我去年正在寻找一个并跑过squirrel-ioc。有些东西我不喜欢它 - 我认为它只支持单例样式实例。

  

Squirrel是一个IoC容器   在Javascript中实现推广   更好地利用架构和   基于浏览器的Javascript中的模式   应用

我开始编写自己的东西并且相当远(构造函数和setter注入,值和引用关系,单例支持,JsUnit测试)但在我的应用程序中从未真正需要它。我可能要查看卢克的项目。作为参考,这是我最终得到的配置格式的一个例子。

var iocConfig = {
  "a" : { Type : A },
  "b1" : { Type : B, Props : [{Name : 'Letter', Ref : "a"}]  },
  "b2" : { Type : B, Props : [{Name : 'Letter', Val : "a"}]  },
  "c2" : { Type : C, Args : [{Ref : "a"}, {Val : "a"}]  },
  "d" : { Type : D, Props : [{Name : 'Letter', Ref : "a"}]  },
  "date" : { Type : Date, Props : [{Name : 'FullYear', Val : 2008}, {Name : 'Month', Val : 0}, {Name : 'Date', Val : 1}]  },
  "array3" : { Type : Array, Args : [{Val : 3}]  },
  "number1" : { Type : Number, Args : [{Val : 1}]  },
  "string1" : { Type : String, Args : [{Val : "1"}]  },
  "s-true" : { Type : S, Singleton : true},
  "s-false" : { Type : S, Singleton : false}
};

答案 2 :(得分:3)

我把一个简单的轻量级ioc容器放在一起,称之为JsfIoc。

http://github.com/fschwiet/JsfIoc

答案 3 :(得分:1)

查看Inverted http://philmander.github.com/inverted/,这是我创建的功能打包的Javascript IOC容器。它在浏览器中运行在AMD之上,也适用于Node。

  

与AMD一起使用时,Inverted使用单独的配置文件来表示如何实例化类以及它们如何交互。一旦定义了这些默认值和关系,就可以创建应用程序上下文,并且可以使用类的实例。

http://dailyjs.com/2013/01/04/controldeck-xlsx-inverted/

答案 4 :(得分:0)

在JavaScript和Ruby这样的动态类型语言中,DI并不是那么有用。

DI在Java等静态类型语言中的主要好处在于测试 - 用mock替换某些类的实际实现。那是因为在Java类中是不可变的,你不能只是用模拟轻松替换它们 - 你需要一个完整的DI系统来实现它。

但是在JavaScript中,您可以轻松地用模拟的类替换现有的类/方法。因此,实际上并不需要DI来实现可测试性。

当然还有其他可能有用的情况,但你还没有真正指出你想要使用DI的内容,所以我介绍了最明显的情况。

答案 5 :(得分:0)

我使用一个,这是来自specs的简单代码(它是CoffeeScript):

di.register 'a', -> 'component a'
di.get('a').should be: 'component a'

还有回调,不同的范围(应用程序,实例,自定义),显式分配组件的能力。

DI: https://github.com/alexeypetrushin/rad_core/blob/master/assets/lib/dependency_injection.coffee

规格: https://github.com/alexeypetrushin/rad_core/blob/master/assets/lib_spec/dependency_injection_spec.coffee

我用它来组装Backbone.js应用程序,有很多对象(App,Menu,Notice,...),它让我的生活更轻松。

警告:我在内部使用已更改的本机对象,因此可能存在一些错误:)请让我知道它们,我可能会在一两天内修复它(通过问题页面https://github.com/alexeypetrushin/rad_core/issues提交)

P.S。不喜欢IoC术语它太宽泛,DI更精确的定义。

答案 6 :(得分:0)

您可以查看这个简单的库:fcjs 它非常小,但可以很强大地解耦代码。 它的灵感来自Swiz AS3框架

答案 7 :(得分:0)

另一个(更新的)选项是requireJS(http://requirejs.org/)。

答案 8 :(得分:0)

我们构建了一个名为hilary.js的简单JavaScript IoC容器:https://github.com/Acatar/hilaryjs

有了希拉里,您可以注册并解决服务和工厂问题。如果您需要或想要对容器进行范围调整,它也支持子容器。

修改 我添加了一些examples using hilary,以及achieving Dependency Injection with require.js的示例:

答案 9 :(得分:0)

我已经为JavaScript应用创建了IoC容器,请在http://blog.wolksoftware.com/introducing-inversifyjs

查看

答案 10 :(得分:0)

试试canDI。它是一个简单的依赖注入和对象创建库。您可以创建在创建时自动注册的单例,实例和变量。

https://github.com/bflemi3/canDI

答案 11 :(得分:-1)

尝试注入。它是一个非常强大的IoC JS框架。它被多伦多大学和伯克利大学的几个研究中心使用Infusion

可以在Infusion GitHub pages

找到包含更多信息的项目的GitHub页面