Skip to content

vslinko/vstack-ioc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

vstack ioc

Inversion of Control container with promises support

CircleCI David David Gitter

Usage

// init.js

const {createContainer} = require('vstack-ioc');

export default async function init() {
  const c = createContainer();

  require('./orm')(c);
  require('./user')(c);

  await c.build();

  const modelManager = await c.get('modelManager');
  console.log(modelManager.getModels()); // [UserModel, GroupModel]
}
// orm.js

class ModelManager {
  constructor() {
    this.models = [];
  }

  addModel(model) {
    this.models.push(model);
  }

  getModels() {
    return this.models.concat();
  }
}

module.exports = (c) => {
  c.set('modelManager', () => new ModelManager());

  c.onBuild(async () => {
    const modelManager = await c.get('modelManager');
    const models = await c.search('model');

    models.forEach(model => modelManager.addModel(model));
  });
});
// user.js

class UserModel {
  // ...
}

class GroupModel {
  constructor(userModel) {
    this.userModel = userModel;
  }

  // ...
}

module.exports = (c) => {
  c.set({
    name: 'userModel',
    tags: ['model'],
    value: () => new UserModel(),
  });
  c.set({
    name: 'groupModel',
    dependencies: ['userModel'],
    tags: ['model'],
    value: (userModel) => new GroupModel(userModel),
  });
};