0.0.4 • Published 10 years ago

es6-dic v0.0.4

Weekly downloads
2
License
MIT
Repository
github
Last release
10 years ago

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