作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为分布式应用程序构建基础库。结构如下:
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();
cfg = {db: null}
并导出 initModule
在每个需要依赖的模块中运行。 有没有更好的方法来为核心库及其所有模块提供消费者提供的依赖项,例如 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/
我是一名优秀的程序员,十分优秀!