【问题标题】:CommonJs and AMD are both kind of dependency injection?CommonJs 和 AMD 都是依赖注入?
【发布时间】:2014-01-14 05:18:05
【问题描述】:

我只是碰了一下dependency injection的概念,

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

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

你定义的模块,应该只暴露抽象 API,可能的细节更少

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

【问题讨论】:

  • RequireJS 具有开箱即用的依赖注入和控制反转。据我了解,RequireJS 本身就是一个 IoC 容器。

标签: dependency-injection amd commonjs


【解决方案1】:

你可以这样想:

AMD 之于 JavaScript 是什么:

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

确实,它可以用于注入依赖项,但当被认为是一种 DI 机制时——而不仅仅是一个模块加载器——它鼓励将每个模块编写为单例。

例子:

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 的多个实例,因为它返回的是构造函数/工厂方法而不是实例。

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

【讨论】:

    【解决方案2】:

    它可以用于某些工作,但实际上并非如此。

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

    使用 通过 之类的库,您倾向于看到的模式是通过约定直接引用,感觉很像项目引用

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 2021-09-18
      • 2021-03-05
      • 1970-01-01
      • 2015-06-13
      • 2021-11-19
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多