Javascript IoC/DI框架
对于像Java这样的强类型静态语言,IoC/DI框架/工具包对于解耦复杂系统是非常宝贵的,从而使子组件单元可测试,并且能够流畅地组合 我们大多数人都提到Javascript作为松散类型的动态语言已经在精神上提供了IoC/DI的主要好处,而一些人坚持认为应该有更高级别的抽象/实现 对于后者,Javascript领域中常见的IoC/DI实现是什么?请查看。这是我的选择,效果很好 其主要特点是:Javascript IoC/DI框架,javascript,dependency-injection,ioc-container,Javascript,Dependency Injection,Ioc Container,对于像Java这样的强类型静态语言,IoC/DI框架/工具包对于解耦复杂系统是非常宝贵的,从而使子组件单元可测试,并且能够流畅地组合 我们大多数人都提到Javascript作为松散类型的动态语言已经在精神上提供了IoC/DI的主要好处,而一些人坚持认为应该有更高级别的抽象/实现 对于后者,Javascript领域中常见的IoC/DI实现是什么?请查看。这是我的选择,效果很好 其主要特点是: 简单的声明性依赖项注入 一个灵活的、非侵入性的连接基础架构 应用程序生命周期管理 强大的核心工具和插件架
- 简单的声明性依赖项注入
- 一个灵活的、非侵入性的连接基础架构
- 应用程序生命周期管理
- 强大的核心工具和插件架构,用于集成流行框架和现有代码
- 同时支持浏览器和服务器环境
另外,请查看一些备选方案。Angular.js提供了一个依赖关系管理实现,这在我看来非常棒。但是Angular不仅仅是一个DI容器,所以要从中受益,你的应用程序必须从头开始。不过,这值得一试,特别是当您有大量基于表单的交互时。Javascript的Duck类型允许我们轻松模拟依赖关系 下面是一个快速示例,说明了如何做到这一点: 我们有一个简单的函数,它表示要添加到数据库中的项。 DB是一个我们想要模拟的依赖项
function SaveItem(item){
var db = new DB();
db.insert(item);
};
如果我们将DB依赖项更改为一个参数,那么我们可以注入任何我们想要的内容。
调用该函数时,它会检查数据存储参数是否存在。当项目存在时,该值被分配给db。当数据存储为null或未定义时,将创建一个新的DB对象。这使您可以满怀信心地注入依赖项,相信db总是有值的
function SaveItem(item, dataStore){
var db = dataStore || new DB();
db.insert(item);
};
现在我们可以这样模拟我们的依赖关系:
function mockDb(){
return{
insert: function(){
assert(true);
}
}
};
并在测试中将所有这些结合在一起:
function SaveItemShouldCallInsertOnDb = function(){
var testDb = new mockDb();
var someTestItem = { name: "test item" };
SaveItem(someTestItem, testDb);
};
对否决票有何评论?这似乎是对否决权的一个相当奇怪的回答……是的,为什么否决权?DI框架的全部优势在于,实现应该在应用程序或测试级别决定,而不是在函数内部决定。如果我有应用程序A,它调用服务B。。。它使用服务X。如果我是X的作者并将其更新为需要服务Z,则应用程序A的作者不应负责将Z从应用程序A->B->C中删除…->这是像Guice或Spring这样的DI框架的工作。javascript有相当的框架可以做到这一点,但是你的例子没有说明它是如何实现的。只有当你使用AMD兼容的应用程序时,这才是一个好的选择。从这些例子中,我还得到了这样的印象:你必须在IoC中编写应用程序,这有点违背了IoC的目的。也就是说,您的组件独立于或应该独立于国际奥委会。例如,在Java中,您可以通过定义POJO来实现这一点,然后使用IoC将它们连接在一起。为什么主页上没有简单的示例?寻找DI框架的人通常已经知道其优点,因此最有价值的应该是一个简单的例子,说明如何注入依赖项并掌握样板代码的度量,以便快速比较框架。。HelloWire示例在文档中隐藏得太深了: