es6-dic

0.0.4 • Public • Published

es6-dic

ES6 Dependency Injection Container

Install

$ npm install es6-dic

Usage

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';

API

.register(name, [dependencies,] factory)

Register name with optional dependencies. factory is used to create instance, the arguments are the specified dependencies.

Dependency order is important.

.resolve(name)

Get instance for name.

Notes

"But how can I run this?!"

Well, I use it with browserify & es6ify. It should work with traceur, but afaik module import/export is not compatible with node.

"But I need circular dependencies!!4"

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'], function(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')();

"But I need multiple instances, not singletons!"

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!

"Tests?!"

Eeerrr, run them with browserify :S, not very node-friendy. If you have a better solution, please create an issue!

License

MIT

Package Sidebar

Install

npm i es6-dic

Weekly Downloads

1

Version

0.0.4

License

MIT

Last publish

Collaborators

  • lennon