-
Allows JavaScript developers to write code that follows the SOLID principle. -
Promote and encourage adherence to best object-oriented programming and dependency injection practices. -
Minimize runtime overhead. -
Provide artistic programming experience and ecology.
use
Step 1: Define the interface
// file interfaces.ts export interface Warrior { fight(): string; sneak(): string; } export interface Weapon { hit(): string; } export interface ThrowableWeapon { throw(): string; }
Step 2: Define dependency
// file entities.ts import { injectable, inject } from "inversify"; import "reflect-metadata"; import { Weapon, ThrowableWeapon, Warrior } from "./ interfaces"; import { TYPES } from "./types"; @injectable() class Katana implements Weapon { public hit() { return "cut! "; } } @injectable() class Shuriken implements ThrowableWeapon { public throw() { return "hit! "; } } @injectable() class Ninja implements Warrior { private _katana: Weapon; private _shuriken: ThrowableWeapon; public constructor( @inject(TYPES.Weapon) katana: Weapon, @inject(TYPES.ThrowableWeapon) shuriken: ThrowableWeapon ) { this._katana = katana; this._shuriken = shuriken; } public fight() { return this._katana.hit(); } public sneak() { return this._shuriken.throw(); } } export { Ninja, Katana, Shuriken };
Step 3: Create and configure the IOC container
// file inversify.config.ts import { Container } from "inversify"; import { TYPES } from "./types"; import { Warrior, Weapon, ThrowableWeapon } from "./ interfaces"; import { Ninja, Katana, Shuriken } from "./ entities"; const myContainer = new Container(); myContainer.bind<Warrior>(TYPES. Warrior).to(Ninja); myContainer.bind<Weapon>(TYPES. Weapon).to(Katana); myContainer.bind<ThrowableWeapon>(TYPES. ThrowableWeapon).to(Shuriken); export { myContainer };
Step 4: Dependency resolution
import { myContainer } from "./inversify.config"; import { TYPES } from "./types"; import { Warrior } from "./interfaces"; const ninja = myContainer.get<Warrior>(TYPES. Warrior); expect(ninja.fight()).eql("cut!"); // true expect(ninja.sneak()).eql("hit!"); // true