Skip to content

Latest commit

 

History

History
131 lines (91 loc) · 2.38 KB

README.md

File metadata and controls

131 lines (91 loc) · 2.38 KB

Dependency Injection Container for ES6

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

new Container([parent])

Creates a new container, with optional parent, to delegate resolve, when an item is missing.

.register(name, [dependencies,] factory)

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.

.resolve(name)

Get instance for name. If not found, throws an Error.

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'], 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