节点库暴露具有依赖关系的组件

Node library exposing components with dependencies

我正在开发一个基于 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 只是间接暴露,而且代码对我来说看起来很奇怪。有没有更优雅或 "standard" 的方法来公开具有依赖关系的组件?

就用一个正则函数? :

 const _Entity = require('./Entity.js');
 const Field = require('./Field.js');

 module.exports = function init(knex){
   return {
     Field,
     Entity: _Entity.bind(_Entity, knex)
  };
};