$ 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