Home

CDI

Build Status Coverage Status Maintainability Package Quality

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.

Usage

npm install --save cdi

and code:

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:

class Wheels {
    constructor(size) {
        this.size = size;
    }
}
module.exports = Wheels;
module.exports.inject = ['config:bike:wheels.size'];

src/bike.js:

class Bike {
    constructor(wheels) {
        this.wheels = wheels;
    }
}
module.exports = Bike;
module.exports.inject = ['Wheels'];

main.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:

class Speed {
    constructor() {
        this.speed = 0;
    }

    setSpeed(speed) {
        this.speed = speed;
    }
}
module.exports = Speed;

src/wheel.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:

class Bike {
    constructor(frontWheel, backWheel) {
        this.wheels = {frontWheel, backWheel};
    }
}
module.exports = Bike;
module.exports.inject = ['Wheel:front', 'Wheel:back'];

main.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

Documentation

So you're still on it? :) great!! A good start is Options

Contribute

You want to make the world a better place and want to start with this module? awesome :D
Please read the contribution guidelines to get started and i'm looking forward to new stuff.