$ npm install es6-dic
import Container from 'es6-dic';
var c = new Container();
c.register('a', ['b'], b => b + 'a');
c.register('b', () => 'b');
console.log(c.resolve('a')) // 'ba';Creates a new container, with optional parent,
to delegate resolve, when an item is missing.
Register name with optional dependencies.
factory is used to create instance,
the arguments are the specified dependencies.
If you create a circular dependecy, an Error
is thrown.
Dependency order is important.
Get instance for name. If not found, throws an Error.
Well, I use it with browserify & es6ify. It should work with traceur, but afaik module import/export is not compatible with node.
Well, register the container itself as a dependency, and resolve the needed module in runtime!
var c = new Container();
c.register('inject', () => c);
c.register('beep', ['boop'], boop => {
return function() {
console.log('beep');
setTimeout(boop, 1000);
};
});
c.register('boop', ['inject'], inject => {
var beep;
return function() {
beep = beep || inject.resolve('beep');
console.log('boop');
setTimeout(beep, 1000);
};
});
c.resolve('beep')();Well, then don't return instance in the factory!
c.register('Bar', () => {
// return new Bar();
// instead of returning an instance, return a constructor!
return Bar;
});
c.register('foo', ['Bar'], (Bar) => {
var instance = new Bar();
});A more complex example:
class Bar {
constructor(...stuff) {
this.stuff = stuff;
}
foo() {
console.log(...this.stuff)
}
}
c.register('Bar', ['a', 'b'], (a, b) => Bar.bind(null, a, b));
c.register('a', () => 1);
c.register('b', () => 2);
c.register('c', ['Bar'], Bar => {
var b = new Bar(3);
b.foo();
});
c.resolve('c'); // 1, 2, 3 \o/ yay!Eeerrr, run them with browserify :S, not very node-friendy. If you have a better solution, please create an issue!
MIT