在服务中注入其他服务
# 没有依赖的服务
import { Injectable } from "@kaokei/di";
@Injectable()
export class A {
name = "A";
}
1
2
3
4
5
6
2
3
4
5
6
很显然这是最简单的场景,这个服务没有任何的依赖,只需要使用@Injectable()
这个装饰器声明一下这个服务可注入即可。
# 通过构造函数注入依赖
import { Injectable, Inject } from "@kaokei/di";
@Injectable()
export class B {
name = "B";
}
@Injectable()
export class C {
name = "C";
}
@Injectable()
export class A {
name = "A";
constructor(public b: B, @Inject(C) public c: C) {}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
上方代码展示了类 A 依赖类 B 和类 C。
在注入 b 时,并没有使用@Inject
,这是因为本库可以从 b 的类型中推导出来 b 的类型时 B,而 B 是一个类,那么就会注入一个 B 类的实例化对象。
在注入 c 时,则明确使用了@Inject
,此时就直接使用@Inject
的参数 C 来注入一个实例化对象。当然这里确实时多此一举没有必要,但是在有些特殊场景下,我们可以修改注入其他服务@Inject(AnotherC)
,这样实例属性 c 的类型还是 C,但是实际上指向的是一个AnotherC
的实例化对象。
# 通过实例属性注入依赖
import { Injectable, Inject } from "@kaokei/di";
@Injectable()
export class B {
name = "B";
}
@Injectable()
export class C {
name = "C";
}
@Injectable()
export class A {
name = "A";
@Inject()
b!: B;
@Inject(C)
c!: C;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
可以直接在实例属性上使用@Inject
来注入服务对象,只不过属性注入的@Inject
是不能省略的,而构造函数中可以省略。
虽然属性注入不能省略@Inejct
,但是可以省略@Inject
的参数。如果没有参数则会通过属性的类型来推导应该注入什么服务。当然也可以不省略进行明确的注入。
提示
虽然上面说到属性注入可以省略@Inject
的参数,那也只能省略属性类型是类的场景,如果属性类型是一个 interface,显然是不行的。
# 复杂例子
// 这里展示了一个复杂的类之间的依赖关系
A --> B、C、D
B --> C、D
C --> D、E
D --> E、F
E --> F
F 没有依赖
1
2
3
4
5
6
7
2
3
4
5
6
7
import { Injectable, Inject } from "@kaokei/di";
@Injectable()
export class F {
name = "F";
}
@Injectable()
export class E {
name = "E";
@Inject()
f!: F;
}
@Injectable()
export class D {
name = "D";
@Inject()
e!: e;
@Inject()
f!: F;
}
@Injectable()
export class C {
name = "C";
constructor(public d: D, public e: E) {}
}
@Injectable()
export class B {
name = "B";
@Inject()
c!: C;
constructor(public d: D) {}
}
@Injectable()
export class A {
name = "A";
constructor(public b: B, public c: C, public d: D) {}
}
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
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
上面的例子展示了可以混用构造函数注入和属性注入。
编辑 (opens new window)
上次更新: 2023/08/22, 17:17:59