Providers
参考控制反转与依赖注入
Provider 只是一个用 @Injectable()
装饰器修饰的类,module 引入service在providers注入,在Controller 就可以使用注入好的service了
基本使用方式
这是最简单service模型,如项目默认代码:
app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
自定义注入的名称
我们可以自定义注入的名称,如改变AppService的注入名称
app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './user/user.module';
@Module({
imports: [UserModule],
controllers: [AppController],
providers: [
{
provide: 'ABC',
useClass: AppService,
},
],
})
export class AppModule {}
app.controller.ts
import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(@Inject('ABC') private readonly defg: AppService) {}
@Get()
getHello(): string {
return this.defg.getHello();
}
}
两者效果是一样的,只是一个是简写,一个是全称,一般使用简写方式
自定义注入的值
我们还可以自定义注入的值,如图设置任意的注入名称,使用useValue注入任意类型的值
然后就可以在控制器中使用了
工厂模式
如果服务之间有相互的依赖或者逻辑处理可以使用useFactory,可以注入其他的已注入的类,如下DemoService
在函数里面可以做各种判断,返回任意的数据,然后在控制器中使用
这个工厂模式也支持异步的方式,我们可以使用setTimeout模拟一下,改造useFactory函数
{
provide: 'HiHi',
nject: [DemoService],
async useFactory(DemoService: DemoService) {
return await new Promise((r) => {
setTimeout(() => {
r(DemoService.getHello());
}, 2000);
});
},
},