Naivete Precedes Misrepresentation
    Have ideas to improve npm?Join in the discussion! »

    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

    Install

    npm i es6-dic

    DownloadsWeekly Downloads

    4

    Version

    0.0.4

    License

    MIT

    Last publish

    Collaborators

    • avatar