无题

Providers

Providers 是 Nest 的一个基本概念。许多基本的 Nest 类可能被视为 provider - servicerepositoryfactoryhelper 等等。 他们都可以通过 constructor 注入依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。 Provider 只是一个用 @Injectable() 装饰器注释的类。

1.基本用法

module 引入 service  在 providers 注入 

![[83a5e31c147e948fb66375779a62a2d2_MD5.png]]

在Controller 就可以使用注入好的service 了 

![[e52244a25ef5b4ce4bbc5a139984879b_MD5.png]] 

2.service 第二种用法(自定义名称)

第一种用法就是一个语法糖

其实他的全称是这样的

1
2
3
4
5
6
7
8
9
10
11
12
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';

@Module({
controllers: [UserController],
providers: [{
provide: "Xiaoman",
useClass: UserService
}]
})
export class UserModule { }

![[4f86c6723fdba14ce2424761db1f649b_MD5.png]]

 自定义名称之后 需要用对应的Inject 取 不然会找不到的

![[f6a3299f0b14c229fb587fbf088c1f38_MD5.png]]

3.自定义注入值

通过 useValue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';

@Module({
controllers: [UserController],
providers: [{
provide: "Xiaoman",
useClass: UserService
}, {
provide: "JD",
useValue: ['TB', 'PDD', 'JD']
}]
})
export class UserModule { }

![[4bc475e74c5aaf82d89ed5a406460289_MD5.png]]

 ![[dac34766da810638b7497aa7f099d712_MD5.png]]

3.工厂模式

如果服务 之间有相互的依赖 或者逻辑处理 可以使用 useFactory

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
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserService2 } from './user.service2';
import { UserService3 } from './user.service3';
import { UserController } from './user.controller';

@Module({
controllers: [UserController],
providers: [{
provide: "Xiaoman",
useClass: UserService
}, {
provide: "JD",
useValue: ['TB', 'PDD', 'JD']
},
UserService2,
{
provide: "Test",
inject: [UserService2],
useFactory(UserService2: UserService2) {
return new UserService3(UserService2)
}
}
]
})
export class UserModule { }

![[1bd52299dffb7e573dcfd07d9585d088_MD5.png]]

 ![[f3900e8396e3d91a11e4cf036a987b38_MD5.png]]

4.异步模式

useFactory 返回一个promise 或者其他异步操作

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
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserService2 } from './user.service2';
import { UserService3 } from './user.service3';
import { UserController } from './user.controller';

@Module({
controllers: [UserController],
providers: [{
provide: "Xiaoman",
useClass: UserService
}, {
provide: "JD",
useValue: ['TB', 'PDD', 'JD']
},
UserService2,
{
provide: "Test",
inject: [UserService2],
useFactory(UserService2: UserService2) {
return new UserService3(UserService2)
}
},
{
provide: "sync",
async useFactory() {
return await new Promise((r) => {
setTimeout(() => {
r('sync')
}, 3000)
})
}
}
]
})
export class UserModule { }

![[e01b45f6e13125689a92d0e5bbea309d_MD5.png]]

本文转自 https://xiaoman.blog.csdn.net/article/details/126494064,如有侵权,请联系删除。