InversifyJS 基础演示(TS)

代码解析

1import * as inversify from 'inversify';
2import 'reflect-metadata';

引入 inversify 以及 reflect-metadata 两个包。

1const TYPES = {
2    // 忍者
3    Ninja: 'Ninja',
4    // 武士刀
5    Katana: 'Katana',
6    // 手里剑
7    Shuriken: 'Shuriken'
8}

定义了类对应的映射,这里定义了三个类,看过火影的应该很容易理解Ninja(忍者)、Katana(武士刀)和Shuriken(手里剑)之间的关系。

 1class Katana {
 2    hit() {
 3        return 'cut!';
 4    }
 5}
 6
 7class Shuriken {
 8    throw() {
 9        return 'hit!';
10    }
11}
12
13class Ninja {
14    private _katana: Katana;
15    private _shuriken: Shuriken;
16
17    constructor(katana: Katana, shuriken: Shuriken) {
18        this._katana = katana;
19        this._shuriken = shuriken;
20    }
21
22    fight() {
23        return this._katana.hit();
24    }
25
26    sneak() {
27        return this._shuriken.throw();
28    }
29}

接着是Ninja(忍者)、Katana(武士刀)和Shuriken(手里剑)三个类的实现。其中 Katana 类实现了 hit 方法,Shuriken 实现了 throw 方法,Ninja 中定义了两个私有对象 _katana_shuriken,并在构造函数之中传入这个两个对象,Ninja 类中的 fight 方法中将调用 _katanahit 方法,sneak 方法中将调用 _shurikenthrow 方法。

 1// 声明可被注入以及其依赖项
 2inversify.decorate(inversify.injectable(), Katana);
 3inversify.decorate(inversify.injectable(), Shuriken);
 4inversify.decorate(inversify.injectable(), Ninja);
 5inversify.decorate(inversify.inject(TYPES.Katana), Ninja, 0);
 6inversify.decorate(inversify.inject(TYPES.Shuriken), Ninja, 1);
 7
 8// 声明绑定关系
 9const container = new inversify.Container();
10container.bind(TYPES.Ninja).to(Ninja);
11container.bind(TYPES.Katana).to(Katana);
12container.bind(TYPES.Shuriken).to(Shuriken);

//@TODO

这里终于引入了依赖注入的概念,这里使用了 decorate 来将 KatanaShurikenNinja