Inversion of Control container with promises support
// 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),
});
};