Providers
Providers是Nest的一个基本概念。许多基本的 Nest 类可能被视为 provider - service, repository, factory, helper 等等。 他们都可以通过 constructor 注入依依赖关系。 这意味着对象可以彼此创建各种关系,并且“连接”对象实例的功能在很大程度上可以委托给 Nest运行时系统。Provider 只是一个用@Injectable() 装饰器注释的类。
1.基本用法
module引入service,在providers注入
在Controller就可以使用注入好的service了
2.service第二种用法(自定义名称)
第一种用法就是一个语法糖
其实它的全称是这样的
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
@Module({
controllers: [UserController],
providers: [{
provide: 'zl',
useClass: UserService
}],
})
export class UserModule { }
自定义名称之后,需要用对应的Inject取,不然会找不到的
3.自定义注入值
通过useValue
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
@Module({
controllers: [UserController],
providers: [{
provide: 'zl',
useClass: UserService
},{
provide:'JD',
useValue: ['TB','PDD','JD']
}],
})
export class UserModule { }
@Inject('JD') private shopList: string[]
4.工厂模式
如果服务之间有相互的依赖或者逻辑处理,可以使用useFactory
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserService2 } from './user.service2';
import { UserController } from './user.controller';
@Module({
controllers: [UserController],
providers: [UserService2, {
provide: 'zl',
useClass: UserService
}, {
provide: 'JD',
useValue: ['TB', 'PDD', 'JD']
}, {
provide: 'test',
inject: [UserService2],
useFactory(UserService2: UserService2) {
return 111
}
}],
})
export class UserModule { }
5.异步支持工厂模式
useFactory 返回一个promise 或者其他异步操作
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserService2 } from './user.service2';
import { UserController } from './user.controller';
@Module({
controllers: [UserController],
providers: [UserService2, {
provide: 'zl',
useClass: UserService
}, {
provide: 'JD',
useValue: ['TB', 'PDD', 'JD']
}, {
provide: 'test',
inject: [UserService2],
async useFactory(UserService2: UserService2) {
return await new Promise((res)=>{
setTimeout(() => {
res(UserService2.findAll())
}, 2000);
})
}
}],
})
export class UserModule { }
这个例子是延迟打印出UserService2