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
$ npm install node-injectable --save
Let’s take a look to the recommended usage and APIs of Injectable:
/**
* @injectable(foo)
*/
module.exports.createFoo = function() {
return "foo"
}
/**
* @injectable(bar)
*/
module.exports.createBar = function(foo) {
return new Promise((resolve, reject) => {
resolve(foo + "bar")
})
}
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"
})
})
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.
Your module will be registered as bar
and have 2 dependencies dep1
and dep2
.
/**
* @injectable(bar)
*/
module.exports = function(dep1, dep2) {}
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) {}
/**
* @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() {
}
}
class Foo {
/**
* @injectable(foo)
*/
constructor() {
}
}
module.exports = Foo
class Foo {
/**
* @injectable(foo)
*/
constructor() {
}
}
module.exports.Foo = Foo
/**
* @injectable(foo)
*/
exports.createFoo = function() {
}
/**
* @injectable(bar)
*/
exports.createBar = async function() {
}
/**
* @injectable(default)
*/
function default_1() {
}
exports.default = default_1
class Foo {
/**
* @injectable(foo)
*/
constructor() {
}
}
exports.Foo = Foo
When submitting your pull-request try to follow those guides:
- https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github
- https://medium.com/@vadimdemedes/making-your-first-contribution-de6576ddb190
MIT © Dusan Kmet