Skip to content

kentaromiura/IOC

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

IOC

This is the third rewrite of my really old js IOC container: http://mykenta.blogspot.it/2007/09/kentaioc-js-ioc-library.html.

How to use

To directly use the IOC container with manual injection:

// Construction injection example

import {IOC} from 'kenta-ioc';
import Samurai from './Samurai';
import Shuriken from './Shuriken';
import Sword from './Sword';

const container = new IOC();
container.register("samurai", Samurai);

const warrior1 = container.byConstructor("samurai", new Shuriken);
const warrior2 = container.byConstructor("samurai", new Sword);

warrior1.attack("The evildoers") // Pierced The evildoers armor
warrior2.attack("The evildoers") // Chopped The evildoers in half
// Setter injection example
import {IOC} from 'kenta-ioc';
import Samurai from './Samurai';
import Shuriken from './Shuriken';
import Sword from './Sword';

const container = new IOC();
container.register("samurai", Samurai);

const warrior1 = container.bySetter("samurai", { weapon: new Shuriken });
const warrior2 = container.bySetter("samurai", { weapon: new Sword });

warrior1.attack("The evildoers") // Pierced The evildoers armor
warrior2.attack("The evildoers") // Chopped The evildoers in half

Alternatively it's possible to get a Ninject style configuration using Unit:

import {Unit} from 'kenta-ioc';

import Shuriken from './Shuriken';
import Sword from './Sword';

// This is the contract.
class IWeapon { attack(who){ throw 'not implemented'; } }

class Shuriken extends IWeapon {
    attack(who) { return `Pierced ${who} armor`; }
}
class Sword extends Iweapon {
    attack(who) { return `Chopped ${who} in half`; }
}

const unit1 = new Unit();
const unit2 = new Unit();

class Samurai {
    // This is where the class defines its contract.
    static weapon = IWeapon;

    attack(who) {
        return this.weapon.hit(who);
    }
}

// In unit 1 we will configure IWeapon to be Sword instance...
unit1.bind(IWeapon).to(Sword);
// ...while in unit 2 it will be Shuriken.
unit2.bind(IWeapon).to(Shuriken);

unit1.get(Samurai).attack('The evildoers'); // Chopped The evildoers in half
unit2.get(Samurai).attack('The evildoers'); // Pierced The evildoers armor

About

Inversion of control for JavaScript

Resources

Stars

Watchers

Forks

Packages

No packages published