我正在开始一个基于 Node.js 的长期项目,因此我希望建立在可靠的基础上 dependency injection (DI)系统。
虽然 Node.js 的核心意味着使用简单的模块 require()s 来连接组件,但我发现这种方法不太适合大型项目(例如,每个文件中的 require 模块不是那么可维护、不可测试或动态的)。
现在,我在发布这个问题之前做了一些研究,我发现了一些有趣的 Node.js DI 库(参见 wire.js 和 dependable.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/