我正在开发基于Knex的Node.js ORM库,类似于Bookshelf,用于其他个人项目。
我的库的某些组件需要一个初始化的Knex实例,所以我将它们包装在一个在构造函数中获取Knex实例的对象中,使用包装器函数插入Knex对象,而无需用户在使用时插入它图书馆。我试着这样做,类似于Knex和Bookshelf的做法,但我发现代码很难阅读,除了我使用ES6类,所以它不完全相同。
这是我目前的代码:
const _Entity = require('./Entity.js');
class ORM {
constructor(knex) {
// wrapper for exposed class with Knex dependency;
// knex is the first argument of Entity's constructor
this.Entity = function(...args) {
return new _Entity(knex, ...args);
};
// exposed class without Knex dependency
this.Field = require('./Field.js');
}
}
function init(knex) {
return new ORM(knex);
}
module.exports = init;
这个想法是用户可以使用这样的东西:
const ORM = require('orm')(knex);
const Entity = ORM.Entity;
const Field = ORM.Field;
const User = new Entity('user', [
new Field.Id(),
new Field.Text('name'),
// define columns...
]);
let user = User.get({id: 5});
让我感到困扰的是,Entity
只是间接暴露,代码对我来说很奇怪。是否有更优雅或“标准”的方式来公开具有依赖关系的组件?
答案 0 :(得分:4)
只需使用常规功能? :
const _Entity = require('./Entity.js');
const Field = require('./Field.js');
module.exports = function init(knex){
return {
Field,
Entity: _Entity.bind(_Entity, knex)
};
};