在 NestJS 中,提供者(Provider)是一个核心概念,用于封装业务逻辑和服务。提供者可以是任何类,只要它们被标记为可注入的(即使用 @Injectable()
装饰器)。提供者的主要作用是抽象业务逻辑,使其可以被其他组件(如控制器、其他提供者等)重用和依赖注入。
提供者的类型
服务(Service):
- 最常见的提供者类型,用于处理业务逻辑。
- 通常包含数据访问、计算、外部服务调用等功能。
仓库(Repository):
- 用于处理数据持久化逻辑,如数据库操作。
- 可以是 ORM 库(如 TypeORM、Sequelize)的封装。
工厂(Factory):
- 用于动态创建提供者的实例。
- 可以通过
useFactory
方法定义。
助手(Helper):
- 用于提供辅助功能,如工具函数、公用方法等。
提供者的定义和使用
1. 定义提供者
提供者通常是一个用 @Injectable()
装饰器标记的类。例如:
import { Injectable } from '@nestjs/common';
@Injectable()
export class UserService {
private users = [
{ id: 1, name: 'John Doe', email: 'john@example.com' },
{ id: 2, name: 'Jane Smith', email: 'jane@example.com' },
];
getAllUsers(): any[] {
return this.users;
}
getUserById(id: number): any {
return this.users.find(user => user.id === id);
}
createUser(user: any): void {
const newUser = { id: this.users.length + 1, ...user };
this.users.push(newUser);
}
updateUser(id: number, user: any): void {
const index = this.users.findIndex(u => u.id === id);
if (index !== -1) {
this.users[index] = { ...this.users[index], ...user };
}
}
deleteUser(id: number): void {
this.users = this.users.filter(user => user.id !== id);
}
}
2. 注册提供者
在模块中注册提供者,使其可以被注入到其他组件中。例如,在 app.module.ts
中:
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, UserService],
})
export class AppModule {}
3. 注入提供者
在控制器或其他提供者中,通过构造函数注入提供者。例如:
import { Controller, Get, Post, Put, Delete, Param, Body } from '@nestjs/common';
import { UserService } from './user.service';
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) {}
@Get()
getAllUsers() {
return this.userService.getAllUsers();
}
@Get(':id')
getUserById(@Param('id') id: number) {
return this.userService.getUserById(id);
}
@Post()
createUser(@Body() user: any) {
this.userService.createUser(user);
return `User created`;
}
@Put(':id')
updateUser(@Param('id') id: number, @Body() user: any) {
this.userService.updateUser(id, user);
return `User with id ${id} updated`;
}
@Delete(':id')
deleteUser(@Param('id') id: number) {
this.userService.deleteUser(id);
return `User with id ${id} deleted`;
}
}
工厂提供者
除了普通提供者,NestJS 还支持工厂提供者,通过 useFactory
方法动态创建提供者的实例。例如:
import { Module, Injectable, Inject } from '@nestjs/common';
@Injectable()
class ConfigService {
constructor(private config: { dbHost: string, dbPort: number }) {}
getDbHost() {
return this.config.dbHost;
}
getDbPort() {
return this.config.dbPort;
}
}
@Module({
providers: [
{
provide: 'CONFIG',
useValue: { dbHost: 'localhost', dbPort: 5432 },
},
{
provide: ConfigService,
useFactory: (config: { dbHost: string, dbPort: number }) => {
return new ConfigService(config);
},
inject: ['CONFIG'],
},
],
exports: [ConfigService],
})
export class ConfigModule {}
在这个例子中,ConfigService
通过工厂函数 useFactory
动态创建,并注入了 CONFIG
对象。
总结
提供者是 NestJS 中的核心概念,用于封装和重用业务逻辑。通过依赖注入,提供者可以轻松地在不同的组件之间共享和使用。希望这个介绍能帮助你更好地理解和使用 NestJS 中的提供者。如果你有任何进一步的问题或需要更详细的解释,请随时提问!