The Cool Dependency Injection. An easy to use powerful intuitive dependency injection manager



Cool Dependency Injection
A lightweight, powerful and very easy to use dependency injection framework.
Support singleton, prototype and custom scopes, configuration injection and handling of
multiple instances of modules.
Currently only supports CommonJS. ESM support is on the roadmap and will be added in future
bash
npm install --save cdi
`
and code:
`js
let path = require('path');
let CDI = require('cdi');
let cdi = new cdi({
moduleSrc: [path.join(__dirname, 'src')]
});
let myMainModule = cdi.getInstance('MainModule');
myMainModule.nowDoMyStuff();// as i promised, simple as hell :D
`simple example with module and configuration injection
src/wheels.js:
`js
class Wheels {
constructor(size) {
this.size = size;
}
}
module.exports = Wheels;
module.exports.inject = ['config:bike:wheels.size'];
`
src/bike.js:
`js
class Bike {
constructor(wheels) {
this.wheels = wheels;
}
}
module.exports = Bike;
module.exports.inject = ['Wheels'];
`
main.js:
`js
const path = require('path');
const CDI = require('cdi');const bikeConfig = {
wheels: {
size: 26
}
};
let cdi = new CDI({
moduleSrc: [path.join(__dirname, 'src')],
cacheFile: path.join(__dirname, 'cache', 'cdi.json'),
configurations: {
bike: bikeConfig
}
});
let myBike = cdi.getInstance('Bike');
// now you got your bike with injected wheels, which got the size information injected
`
ready for more?
more complex example with active usage of dependency trees
src/speed.js:
`js
class Speed {
constructor() {
this.speed = 0;
}
setSpeed(speed) {
this.speed = speed;
}
}
module.exports = Speed;
`
src/wheel.js:
`js
class Wheel {
constructor(size, speed) {
this.size = size;
this.position = module.exports.tree;
this.speed = speed;
}
}
module.exports = Wheel;
module.exports.inject = ['config:bike:wheels.size', 'Speed:root'];
`
src/bike.js:
`js
class Bike {
constructor(frontWheel, backWheel) {
this.wheels = {frontWheel, backWheel};
}
}
module.exports = Bike;
module.exports.inject = ['Wheel:front', 'Wheel:back'];
`
main.js:
`js
const path = require('path');
const CDI = require('cdi');const bikeConfig = {
wheels: {
size: 26
}
};
let cdi = new CDI({
moduleSrc: [path.join(__dirname, 'src')],
cacheFile: path.join(__dirname, 'cache', 'cdi.json'),
configurations: {
bike: bikeConfig
}
});
let myBike = cdi.getInstance('Bike');
// now you got your bike with two injected wheels, which got the size information injected
// and share one common speed instance
`
Protoype resolving
CDI can be used as a simple tool to resolve module protoypes by name:`js
let path = require('path');
let CDI = require('cdi');
let cdi = new cdi({
moduleSrc: [path.join(__dirname, 'src')]
});
const MainModule = cdi.getModulePrototype('MainModule');
let myMainModule = new MainModule();
``