node.js - 在 Node.js 中使用全局变量进行依赖注入(inject)

标签 node.js dependency-injection global-variables

我正在开始一个基于 Node.js 的长期项目,因此我希望建立在可靠的基础上 dependency injection (DI)系统。

虽然 Node.js 的核心意味着使用简单的模块 require()s 来连接组件,但我发现这种方法不太适合大型项目(例如,每个文件中的 require 模块不是那么可维护、不可测试或动态的)。

现在,我在发布这个问题之前做了一些研究,我发现了一些有趣的 Node.js DI 库(参见 wire.jsdependable.js)。

但是,为了最大限度地简化和减少重复,我提出了我自己的实现 DI 的建议:

  • 您有一个模块 di.js,它充当容器并通过指向存储依赖项名称及其各自 .js 文件的映射的 JSON 文件进行初始化。 这已经为 DI 提供了动态特性,因为您可以轻松交换测试/开发依赖项。 容器可以通过使用 inject() 函数返回依赖项,该函数找到依赖项映射并使用它调用 require()。

  • 为简单起见,模块被分配给一个全局变量,即 global.$di,这样项目中的任何文件都可以通过调用 $di.inject() 来使用容器/注入(inject)器。

这里是实现的要点:

文件 di.js

module.exports = function(path) {

    this.deps = require(path);

    return {
        inject: function(name) {

                if (!deps[name])
                    throw new Error('dependency "' + name + '" isn\'t registered');
                return require(deps[name]);
        }
    };
};

依赖映射 JSON 文件

{
    "vehicle": "lib/jetpack",
    "fuel": "lib/benzine",
    "octane": "lib/octane98"
}

根据开发/测试模式初始化主 JavaScript 文件中的 $di:

var path = 'dep-map-' + process.env.NODE_ENV + '.json;
$di = require('di')(path);

在一些文件中使用它:

var vehicle = $di.inject('vehicle');
vehicle.go();

到目前为止,使用这种方法我能想到的唯一问题是全局变量 $di。 据推测,全局变量是一种不好的做法,但在我看来,我正在为单个全局变量的成本节省大量重复。

有什么建议可以反对我的提议?

最佳答案

总的来说,这种方法对我来说听起来不错。

全局变量在 Node.js 中的工作方式是当你声明一个没有 var 关键字的变量时,它会被添加到 global 中。在所有模块之间共享的对象。您还可以显式使用 global.varname。示例:

vehicle = "jetpack"
fuel = "benzine"
console.log(vehicle) // "jetpack"
console.log(global.fuel) // "benzine"

使用 var 声明的变量将仅在模块中是本地的。

var vehicle = "car"
console.log(vehicle) // "car"
console.log(global.vehicle) // "jetpack"

所以在你的代码中,如果你正在做 $di = require('di')(path)(没有 var),那么你应该能够使用它在其他模块中没有任何问题。使用 global.$di 可能会使代码更具可读性。

关于node.js - 在 Node.js 中使用全局变量进行依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048819/

相关文章:

node.js - 导出的模块 Node 中所需的模块会发生什么情况?

node.js - node.js 可以在任何托管服务提供商中运行吗?

c# - 如何将依赖项注入(inject)扩展方法?

javascript - 如何使用 express js 创建一个简单的 html 服务器

mysql - 使用事务将巨大的 CSV 文件导入 MySQL

Java Guice - 像 Spring 一样创建多个 'beans' 的 guice 等效方法?

java - 如何使用 cucumber-jvm、cucumber-serenity 和 SerenityObjectFactory 进行多态测试

Matlab:真正的全局变量

java - 数组和类的空指针异常 - Java

python - 使用递归追加到列表python