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
方法中将调用 _katana
的 hit
方法,sneak
方法中将调用 _shuriken
的 throw
方法。
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
来将 Katana
、Shuriken
和Ninja