Javascript IoC / DI框架

时间:2013-03-11 10:48:23

标签: javascript dependency-injection ioc-container

对于像Java这样的强类型静态语言,IoC / DI框架/工具包对于解耦复杂系统非常有用,因此可以使子组件单元可测试且组成流畅。

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

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

3 个答案:

答案 0 :(得分:3)

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

主要特点是:

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

另请查看一些替代方案npm modules for DI

答案 1 :(得分: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);
};

答案 2 :(得分:0)

Angular.js提供了一个很好的IMO依赖管理实现。但是Angular不仅仅是一个DI容器,所以要从中受益,你的应用必须从头开始成为Angular。不过,值得一试,尤其是如果您有大量基于表单的交互。