节点库公开具有依赖关系的组件

时间:2018-03-26 20:54:28

标签: javascript node.js dependency-injection knex.js

我正在开发基于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只是间接暴露,代码对我来说很奇怪。是否有更优雅或“标准”的方式来公开具有依赖关系的组件?

1 个答案:

答案 0 :(得分:4)

只需使用常规功能? :

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

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