/node-injectable

Dependency injection for nodejs on steroids

Primary LanguageJavaScriptMIT LicenseMIT

node-injectable

Build Status Coverage Status npm version

A simple library for dependency injection with support for ES6 generators. For more information about this pattern look at: Dependency injection and Inversion of control.

  • supports ES6 classes
  • supports async functions
  • working with Typescript builds

Install

$ npm install node-injectable --save

Usage

Let’s take a look to the recommended usage and APIs of Injectable:

Step1: Declare factories with some dependencies

/**
 * @injectable(foo)
 */
module.exports.createFoo = function() {
    return "foo"
}

/**
 * @injectable(bar)
 */
module.exports.createBar = function(foo) {
    return new Promise((resolve, reject) => {
        resolve(foo + "bar")
    })
}

Step2: Create a Container a tell him where are your dependencies

let injectable = require('node-injectable')
let container = new injectable.Container()
container.lookup(['src/**/*.js']).then(() => {
    container.resolve('foo').then((foo) => {
        console.log(foo) // print "foo"
    })
    container.resolve('bar').then((bar) => {
        console.log(bar) // print "foobar"
    })
})

Annotations

There is several ways how to annotate modules, functions and classes. In general if you want to register module, function or class automatically by annotations you must provide @injectable(NAME) in comment.

Resolve by parameter

Your module will be registered as bar and have 2 dependencies dep1 and dep2 .

/**
 * @injectable(bar)
 */
module.exports = function(dep1, dep2) {}

Resolve by name

You can specify better names than dep1 or dep2 with extra annotations.

/**
 * @injectable(bar)
 * @param dep1 @inject(logger)
 * @param dep2 @inject(request)
 */
module.exports = function(dep1, dep2) {}

Annotations examples

module.exports functions

/**
 * @injectable(foo)
 */
module.exports.createFoo = function() {
}

/**
 * @injectable(bar)
 */
module.exports.createBar = async function() {
}
/**
 * @injectable(foo)
 */
module.exports = function() {
}
module.exports = {
    /**
     * @injectable(foo)
     */
    createFoo: function() {
    },

    /**
     * @injectable(bar)
     */
    createBar: async function() {
    }
}

module.exports classes

class Foo {
    /**
     * @injectable(foo)
     */
    constructor() {
    }
}
module.exports = Foo
class Foo {
    /**
     * @injectable(foo)
     */
    constructor() {
    }
}
module.exports.Foo = Foo

exports functions (ES6)

/**
 * @injectable(foo)
 */
exports.createFoo = function() {
}

/**
 * @injectable(bar)
 */
exports.createBar = async function() {
}

/**
 * @injectable(default)
 */
function default_1() {
}
exports.default = default_1

exports classes (ES6)

class Foo {
    /**
     * @injectable(foo)
     */
    constructor() {
    }
}
exports.Foo = Foo

Contributing

When submitting your pull-request try to follow those guides:

Licence

MIT © Dusan Kmet