可选依赖
我们可以使用@optional()
装饰器声明一个可选依赖:
@injectable()
class Katana {
public name: string;
public constructor() {
this.name = "Katana";
}
}
@injectable()
class Shuriken {
public name: string;
public constructor() {
this.name = "Shuriken";
}
}
@injectable()
class Ninja {
public name: string;
public katana: Katana;
public shuriken: Shuriken;
public constructor(
@inject("Katana") katana: Katana,
@inject("Shuriken") @optional() shuriken: Shuriken // Optional!
) {
this.name = "Ninja";
this.katana = katana;
this.shuriken = shuriken;
}
}
let container = new Container();
container.bind<Katana>("Katana").to(Katana);
container.bind<Ninja>("Ninja").to(Ninja);
let ninja = container.get<Ninja>("Ninja");
expect(ninja.name).to.eql("Ninja");
expect(ninja.katana.name).to.eql("Katana");
expect(ninja.shuriken).to.eql(undefined);
container.bind<Shuriken>("Shuriken").to(Shuriken);
ninja = container.get<Ninja>("Ninja");
expect(ninja.name).to.eql("Ninja");
expect(ninja.katana.name).to.eql("Katana");
expect(ninja.shuriken.name).to.eql("Shuriken");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
在上面示例中,我们可以看到第一次解析Ninja
时,它的属性shuriken
是undefined的,因为我们并没有为shuriken
声明绑定,且属性使用了@optional()
装饰器进行修饰。
在为shuriken
声明了绑定后:
container.bind<Shuriken>("Shuriken").to(Shuriken);
1
所有已解析的Ninja
实例将包含Shuriken
实例。
默认值
如果一个依赖项被@optional()
装饰器修饰,我们便可以像在其他TypeScript应用中一样声明一个默认值:
@injectable()
class Ninja {
public name: string;
public katana: Katana;
public shuriken: Shuriken;
public constructor(
@inject("Katana") katana: Katana,
@inject("Shuriken") @optional() shuriken: Shuriken = { name: "DefaultShuriken" } // 默认值
) {
this.name = "Ninja";
this.katana = katana;
this.shuriken = shuriken;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14