javascript的控制框架是否存在反转?

javascript的控制框架是否存在反转?,javascript,inversion-of-control,Javascript,Inversion Of Control,javascript的控制框架是否存在反转 关于stackoverflow,我能找到的最接近的答案是:。这看起来是一个很好的开始,但我想我能找到一个发展历史更长的东西 我自己只使用过Castle Windsor,在web客户端领域我真的很怀念它。我开始写一本我从来没有完成过的书。不确定我是否会,因为开销可能不值得。如果您感兴趣,请访问:(这是国际奥委会部分,全套套房位于) mocking库相当完整(虽然没有期望,但目前我只是在mock/stub上使用断言),但是缺少单元测试框架。IoC部分相当完

javascript的控制框架是否存在反转

关于stackoverflow,我能找到的最接近的答案是:。这看起来是一个很好的开始,但我想我能找到一个发展历史更长的东西


我自己只使用过Castle Windsor,在web客户端领域我真的很怀念它。

我开始写一本我从来没有完成过的书。不确定我是否会,因为开销可能不值得。如果您感兴趣,请访问:(这是国际奥委会部分,全套套房位于)

mocking库相当完整(虽然没有期望,但目前我只是在mock/stub上使用断言),但是缺少单元测试框架。IoC部分相当完整,但可能有一些bug(不过不要这么认为)

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


编辑:在jasfac的单元测试中可以看到更多的用法:

我去年一直在寻找一个,后来遇到了。它有一点我不喜欢——我认为它只支持单例风格的实例

松鼠是一个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}
};

在JavaScript和Ruby这样的动态类型语言中,DI并没有那么大的好处

在静态类型语言(如Java)中,DI的主要好处在于测试——用模拟替换某些类的实际实现。这是因为Java中的类是不可变的,您不能简单地用mock替换它们——您需要一个完整的DI系统来实现这一点

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


当然,在其他情况下,DI可能很有用,但您还没有真正指出使用DI的目的,所以我介绍了最明显的情况。

我将一个简单的轻量级ioc容器组合在一起,称之为JSFIC


我使用一个,下面是来自规范的简单代码(它是CoffeeScript):

还有回调、不同的作用域(应用程序、实例、自定义)以及显式分配组件的能力

DI:

规格:

我用它来组装Backbone.js应用程序,有很多对象(应用程序、菜单、通知等等),这让我的生活更轻松

警告:我在内部将其用于已更改的本机对象,因此可能会出现一些错误:)请让我了解它们,我可能会在一两天内修复它(通过问题页面提交)


另外,我不喜欢国际奥委会的术语,因为它太宽泛了,DI是更精确的定义。

你可以看看这个简单的库: 它非常小,但在解耦代码方面非常强大。
它的灵感来自Swiz AS3框架

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

尝试输液。这是一个非常强大的IoC JS框架。多伦多大学和伯克利大学的几个研究中心都在使用它

包含更多信息的项目GitHub页面可以在这里找到

查看我创建的一个功能丰富的Javascript IOC容器。它在浏览器中运行于AMD之上,也可与Node一起使用

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


我们构建了一个简单的JavaScript IoC容器,名为hilary.js:

通过hilary,您可以注册和解析服务和工厂。如果您需要或想要确定容器的范围,它也支持子容器

编辑
我添加了一些,还有一个示例:

我已经创建了JavaScript应用程序的IoC容器,请在

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


你可以在不同的文件中重命名函数,为什么你需要一个框架呢?还有很多。在JasFac(见我的答案),我甚至还没有开始触及可以/应该做什么的表面。这是一个大话题。JavaScript通常只倾向于使用服务定位器样式的模式,完全绕过IoCA。一些响应来自喜欢IoC的人,但实际上并没有使用他们的解决方案。我很好奇,他们是如何保持他们的对象解耦的。使用服务定位器?是的,我也不是squirrel的粉丝,所以我自己写了。我也有同样的想法——开始了,但没有真正的需要,所以一直没有完成。看看我的源代码,尤其是单元测试,你可以用它做的比网站方式多得多。你能详细说明为什么不需要它吗?你能详细说明为什么不需要它吗?正如我在另一篇评论中所说,大多数人在JS中使用服务定位器来满足这种需求。此外,JS的大小确实很重要,因此,除非您正在制作一个非常厚的客户端,否则您希望尽可能减少代码大小和计算量。我认为国际奥委会和国际奥委会是不同的。是的,DI在Javascript中很容易,因为您可以在任何需要的地方编写,我目前正在使用DI进行单元测试。虽然在Javascript中DI要容易得多,但我认为IoC在记录依赖项和使测试代码更干净方面仍然有优势。现在当我测试某些东西时,我必须
di.register 'a', -> 'component a'
di.get('a').should be: 'component a'