【问题标题】:Inject dependencies into ES2015 module将依赖注入到 ES2015 模块中
【发布时间】:2015-11-07 14:35:42
【问题描述】:

是否可以像 C# 或 Java 等其他编程语言一样将依赖项注入到 ES2015 模块中?如果我导入一个模块,我会创建一个对它的硬依赖,并且以后不能在运行时更改它。例如,我有以下 JavaScript 代码:

import Animal from './dog';

class Person {
  feedAnimal() {
    new Animal().feed();
  }
}

我正在导入 dog 模块。但是如果我想把它变成一只猫呢?目前我必须手动修改第 1 行,但在某些情况下,我希望它可以从外部进行配置,以便在某些情况下应该有一只猫,而在其他一些情况下它应该是一只猫。所有这些都可以通过经典的依赖注入来完成。

我知道有一些 DI 框架,例如 ScatterElectrolyteWire 等等,但不幸的是,它们中的大多数都需要一些特殊的语法,并且不是为 @987654324 设计的@。

【问题讨论】:

  • 您希望依赖注入如何工作?你可以使用class Person { constructor(Animal) { this.Animal = Animal; } feedAnimal() { new this.Animal().feed() } },但听起来你期待更高级的东西。
  • 我不确定require-inject 是否支持,但你可能想看看。
  • @lyschoening 谢谢,但我想更改内部模块依赖项,就像编写单元测试一样。
  • @thefourtheye 谢谢你,但我确实不需要需要任何东西。请求是与 CommonJS 相关的事情。我使用闪亮的新 ES2015 导入功能。
  • 您可能会以一种或另一种方式劫持模块加载器。我不建议这样做。

标签: javascript dependency-injection ecmascript-6 es6-module-loader


【解决方案1】:

您不能动态定义依赖关系。 See this question and its accepted answer:

问题: node.js 中的 ES6 变量导入名称?

答案: 与 import 语句无关。 import 和 export 的定义方式使得它们可以静态分析,因此它们不能依赖于运行时信息。

【讨论】:

  • 嗯好的。太糟糕了。您知道任何解决方法或类似的方法吗?
  • SystemJS 这样的模块加载器可以满足您的需求。
  • 如果我无法模拟模块中的任何依赖项进行测试,我会问自己如何编写所有单元测试?
  • 模拟依赖意味着替换或改变实际依赖而不影响使用它的代码,而不是改变使用依赖的代码来使用不同的依赖。我希望这是有道理的,请询问您是否需要澄清。
  • 我知道。因此,我创建了上面的问题;-)
【解决方案2】:

如果您与 Webpack 捆绑,您可以使用 inject-loader 来实现此目的。

希望这对偶然发现这篇旧帖子的人有所帮助。

【讨论】:

    【解决方案3】:

    我搬到了SystemJS。使用 SystemJS,您可以进行动态导入,例如 System.import('foo').then(() => console.log('Loaded));

    另一个优点是 System 将是新的 ECMAScript 标准模块加载器系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多