providers
Nest 实现了 IoC 容器,会从入口模块开始扫描,分析 Module 之间的引用关系,对象之间的依赖关系, 自动把 provider 注入到目标对象
什么是provider
- 被 @Injectable() 修饰的 class
- 在 @Module() 的 providers 中声明
- 示例 AppService
1.useClass
上面是一种简写,完整的写法是通过 provide指定 token,通过 useClass 指定对象的类,nest 会自动对它做实例化后用来注入
2.useValue
除了指定 class 外,还可以指定一个值让 IoC 容器注入
1
2
3
4
5
6
7
8
{
provide: 'person',
useValue: {
name: 'cwy',
age: 34
}
}
在对象里注入
1
2
@Inject('person') private readonly person: {name: string, age: number}
3.useFactory
1.provider 的值支持动态生成,使用 useFactory 动态创建一个对象
1
2
3
4
5
6
7
8
9
10
{
provide: 'person',
useFactory() {
return {
name: 'cwy',
age: 34
}
}
}
在对象里注入
1
2
@Inject('person') private readonly person: {name: string, age: number}
2.useFactory 支持通过参数注入别的 provider
通过 inject 声明了两个 token,一个是字符串 token 的 person,一个是 class token 的 AppService。
1
2
3
4
5
6
7
8
9
10
11
12
{
provide: 'person',
useFactory(person: { name: string }, appService: AppService) {
return {
name: person.name,
desc: appService.getHello()
}
},
inject: ['person', AppService]
}
3.useFactory 支持异步,nest 会等拿到异步方法的结果之后再注入,这样可以更灵活地创建对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
provide: 'person',
async useFactory() {
await new Promise((resolve) => {
setTimeout(resolve, 3000);
});
return {
name: 'cwy',
desc: 'happy coding',
}
}
}
4.useExisting 指定别名
示例:给已有 person provider 命名一个新的 token 叫做 new_person_alias
1
2
3
4
5
{
provide: 'new_person_alias',
useExisting: 'person',
}
2种注入方式
声明依赖后,nest会自动注入依赖
1.通过构造器参数注入
token 是字符串时
注入是要用 @Inject 手动指定注入对象的 token
2.通过属性注入