node-dependency-injector
A small and smart Dependency injection package for node.js without external dependencie, inspired by the powerful Symfony DI container.
Why nDI?
One of the reasons to use a DI Container is to organize your code in better way. Most Node.js projects use a lot of dependencies. Changes in dependencies often require a change in many files. Dependency management can help here to get an overview and to exchange components quickly.
With nDI you get a tool that helps you to better manage your external modules. Especially for larger projects that are bigger than a HelloWorld-Example, a Dependency Injection Container is essential for the maintainability of your project.
How to install nDI?
npm install // for development
or
npm install node-dependency-injector // for useage in your project
easy!
By the way, the code is 100% tested. try it!
npm test
The easiest way to integrate nDI is to use in the container and hand over your objects. You get a di module that you can instantiate.
const di = require('node-dependency-injector').getDic();
let MyDIC = new di();
or require a shared instance of the nDI if you use it in multiple files
let MyDIC = require('node-dependency-injector');
Here you can register your objects.
let myResource = { someProp: 'someData'};
MyDIC.set('myNamedResource', myResource);
at another place in the code you can use:
let myIncredibleObject = MyDIC.get('myNamedResource');
// do something meaningful with your Object
console.log(myIncredibleObject.someProp);
This is nothing exciting and can be realized with normal variable declarations.
Wait, it will be more exciting!
You can test an existing resource with:
let myConfig = { path: './someData/'};
MyDIC.set('config', myConfig);
if (MyDIC.has('config')) {
... do something
}
Here we go! The factory!
const animal = {} { return 'GRRRRRR'; }; MyDIC;
... in the depths of the code ...
Get a Instance from your Resource
let Fiffi = MyDIC; console;
More advanced code usage
for example you have a class file
// animal.js
class Animal {
constructor(name){
this.name = name ;
}
getName(){
return this.name;
}
}
module.exports = Animal;
you can use a config variable or configFile
let serviceConfig = {
autoload: true,
parameters: {
'animal.name': 'Kitty'
},
services : {
'animal': {
fileName: __dirname + '/animal',
args: ['%animal.name%'],
shared: true
}
}
};
set it to nDI via setConfig
MyDIC.setConfig(serviceConfig);
and get your Class Instance from the DI
let MyCat = MyDIC.get('@animal');
console.log(MyCat.getName()); // => Kitty
configfile autoloader
Summary:
MyDIC.set('name', data) inserts a resource
MyDIC.get('name') will return a resource
MyDIC.has('...') will return a boolean, true if a resource is present
MyDIC.setConfig({...}); will set your config, don't forget the autoloader!
MyDIC.get('@resourceName') will instantiate your resource from a config or configFile
and what is next?
- Fileloader integration for configfiles
- maybe yaml support