CommonJs和AMD都是依赖注入?

时间:2013-12-26 14:47:04

标签: dependency-injection amd commonjs

我只是触及dependency injection

的概念

然后我认为CommonJs和AMD有点dependency injection

因为在任一标准下定义模块时,必须首先加载其依赖模块。

您定义的模块应仅公开抽象API,可能不太详细

我是对的吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

它可以用于某些工作但不是真的。

依赖注入通常与编译代码有关。在大多数情况下,更改引用的二进制文件需要重新编译和重新部署。 允许选择在运行时通过文本文件使用哪个二进制文件,从而无需重新编译产品。

通过像这样的库使用,您看到的模式是通过约定直接引用,感觉很像项目引用

对于依赖项目,您确实开始通过config查看库交换。在这种情况下,通过更改代码来更新引用的路径。虽然这与类似,但它是代码更改。例如,以下内容定义了

的路径
require.config({
    paths: {
        modernizr: '//cdnjs.cloudflare.com/ajax/libs/modernizr/2.7.1/modernizr.min'
    }
});

更改依赖项,开发人员需要更改 代码而不是

答案 1 :(得分:0)

你可以这样想:

AMD对JavaScript有什么:

  • #include是C
  • import是Java
  • require是NodeJS

实际上它可以用来注入依赖关系但是当被认为是DI机制 - 而不仅仅是模块加载器 - 它鼓励将每个模块编写为Singleton。

示例:

define('a', function () {
  return {
    doX: function () { ... }
  };
});

define('b', ['a'],  function (a) {
  return {
    doY: function () { 
      a.doX(); 
    }
  };
});

您可以说您已将a注入b但由于只有a的一个副本 - 一个单身人士 - 而AMD知道每次模块将其用作依赖项时,它将始终使用相同的内容。

如果您改为:

define('A', function () {
  function A(options) {  // some constructor/factory method
     return {
       doX: function () {...}
     }
  }

  return A;
});

define('b', ['A'],  function (A) {

    if (<some condition>) {
      var customOptions = {<some options>}
      var a1 = new A(customOptions);

      return {
         doY: function () {
            a1.doX();
         }
      };
    }

    var defaultOptions = {<default>}
    var a2 = new A(defaultOptions);
    return {
      doY: function () {
         a2.doY();
      }
    }
});

在第二个示例中,您可以创建模块A的多个实例,因为它返回构造函数/工厂方法而不是实例。

为了便于测试避免单身人士通常是个好主意,因为这意味着你可以实际注入不同的实例甚至是存根。如果您尝试注入的模块是单身人士,这几乎是不可能的。