依赖注入
nestjs 实现了一个 IOC 容器,存储着可以依赖注入的类(使用了 @Injectable )和被注入的类(@Controller),IOC 容器可以屏蔽一些类的实例化操作。
使用 @injectable 修饰的类,可以被注入到其他类中,同时也能被注入其他的依赖对象。
使用 provider(提供者)来实现 DI
一般 Module providers 的 provide 是一个 token 时,在依赖注入时,需要使用 @Inject 来注入依赖
这几种情况是不需要使用 @Inject 的
- provide 配置的是类,而不是 token
- Module providers 直接存储需要注入的类
- Module 直接引入其他模块的 Module(被引入 Module exports 中的依赖会被引入到当前 Module 中)
使用 useClass
提供给当前模块的是一个类,这个类最终由 IOC 容器来实例化为一个对象,使用 Inject 修饰器就可以将这个对象修饰到目标类的实例对象上,通过 this 可以直接使用了
AppModule
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserService } from './user/user.service';
@Module({
imports: [],
controllers: [AppController],
providers: [
// 是下面写法的一种语法糖吧
AppService,
{
// provide: 'user_service',
provide: UserService,
// class 有 IOC 容器来实例化
useClass: UserService,
},
],
})
export class AppModule {}
// 使用
import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
import { UserService } from './user/user.service';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
// provide 是类就不需要使用 @Inject 修饰器了
// @Inject('user_service')
private readonly userService: UserService,
) {}
@Get()
getHello(): string {
console.log(this.userService.getUser());
return this.appService.getHello();
}
}
使用 useValue
这种方式可以提供一个静态的值,这个值可以是对象,也可以是一个基础类型的数据
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserService } from './user/user.service';
@Module({
imports: [],
controllers: [AppController],
providers: [
AppService,
{
provide: 'name',
useValue: 'xiaoliu',
},
],
})
export class AppModule {}
// 使用
import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
@Inject('name')
private readonly name: string,
) {}
@Get()
getHello(): string {
console.log(this.name);
return this.appService.getHello();
}
}