gpt4 book ai didi

javascript - 如何向底层库提供 db、logger 等依赖项?

转载 作者:行者123 更新时间:2023-11-30 05:34:53 25 4
gpt4 key购买 nike

设置

我正在为分布式应用程序构建基础库。结构如下:

core_project/
lib/
index.js
module1.js
module2.js
...
package.json

我的应用程序的许多其他部分将像这样使用这个库:

consumer_project/
node_modules/
core_project/
...
app.js
package.json

问题

我想要一些通用的依赖项,例如由消费者应用程序提供的数据库处理程序。初始化后,我希望所有核心应用程序模块都能够使用这些依赖项。

尝试的解决方案

我尝试在每个核心应用程序模块中创建一个模块初始化函数:core_project/lib/module1.js

var cfg = {db: null};

module.exports = {
// ...
'initModule': function (db) {
cfg.db = db;
}
}

这是我的核心模块索引文件:core_project/lib/index.js

var modules = {
'module1': require('./module1'),
'module1': require('./module2'),
// ...
};

function create(db) {
var app = {};
init(app, modules, db);
return app;
}

function init(app, mods, db) {
var m;
for (m in mods) {
if (mods.hasOwnProperty(m)) {
if (mods[m].hasOwnProperty('initModule')) {
mods[m].initModule(db);
}

app[m] = mods[m];
}
}
}

module.exports = create;

现在,我的消费者应用程序可以像这样传递依赖项:consumer_project/app.js

var core = require('core_project');
var db = // initialize db

var app = core(db);

// Start using
app.module1.run();

尝试解决的问题

  1. 我必须添加 cfg = {db: null} 并导出 initModule在每个需要依赖的模块中运行。
  2. 我必须将每个模块附加到 core_project/lib/index.js 中的核心应用程序对象

问题

有没有更好的方法来为核心库及其所有模块提供消费者提供的依赖项,例如 db、logger?

最佳答案

将依赖项作为参数传递(即依赖项注入(inject))是实现此目的的一种完全有效的方法,尽管您可以使用闭包来简化您的 init:

core_project/lib/module1.js:

module.exports = function(db) {
return function() {
// closure scoped with dependencies
// can use db object
};
}

然后您的 init 函数将创建闭包:

app[m] = mods[m](db);

像这样传递 dep 对于数据库客户端来说通常是可取的,因此在整个模块中使用相同的连接,但是其他类型的 dep(如记录器)可能更好地使用模块系统,例如require(' winston ')

关于javascript - 如何向底层库提供 db、logger 等依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24476422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com