Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript IoC/DI框架_Javascript_Dependency Injection_Ioc Container - Fatal编程技术网

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实现是什么?请查看。这是我的选择,效果很好 其主要特点是: 简单的声明性依赖项注入 一个灵活的、非侵入性的连接基础架构 应用程序生命周期管理 强大的核心工具和插件架

对于像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示例在文档中隐藏得太深了: