11

对于像 Java 这样的强类型静态语言,IoC / DI 框架 / 工具包对于解耦复杂系统非常宝贵,从而使子组件可单元测试并且它们的组合流畅。

我们中的大多数人认为 Javascript 作为松散类型的动态语言已经在精神上提供了 IoC / DI 的主要好处,而有些人坚持认为应该有更高级别的抽象/实现。

对于后者,Javascript 领域中常见的 IoC / DI 实现是什么?

4

3 回答 3

3

请查看wire.js。这是我的选择,而且效果很好。

主要特点是:

  • 简单的声明式依赖注入
  • 灵活的非侵入式连接基础设施
  • 应用生命周期管理
  • 强大的核心工具和插件架构,用于集成流行的框架和现有代码。
  • 支持浏览器和服务器环境

另请检查DI 的一些替代 npm 模块

于 2013-03-11T21:25:26.463 回答
2

Javascript 的 Duck-Typing 允许我们轻松地模拟依赖项。

这是一个快速示例,说明如何执行此操作:

我们有一个简单的函数,它表示要添加到数据库中的项目。DB 是我们想要模拟的依赖项。

function SaveItem(item){

    var db = new DB();

    db.insert(item);

};

如果我们将 DB 依赖项更改为参数,那么我们可以注入任何我们想要的东西。当函数被调用时,它会检查 dataStore 参数是否存在。当项目存在时,该值被分配给 db。当 dataStore 为 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);
};
于 2013-03-11T21:38:22.890 回答
-1

Angular.js 提供了一个很棒的 IMO 依赖管理实现。但是 Angular 不仅仅是一个 DI 容器,因此要从中受益,您的应用程序必须从头开始使用 Angular。不过,值得一试,尤其是在您有大量基于表单的交互时。

于 2013-03-11T21:33:16.340 回答