在 NestJS 中,提供者(Provider)是一个核心概念,用于封装业务逻辑和服务。提供者可以是任何类,只要它们被标记为可注入的(即使用 @Injectable() 装饰器)。提供者的主要作用是抽象业务逻辑,使其可以被其他组件(如控制器、其他提供者等)重用和依赖注入。

提供者的类型

  1. 服务(Service)

    • 最常见的提供者类型,用于处理业务逻辑。
    • 通常包含数据访问、计算、外部服务调用等功能。
  2. 仓库(Repository)

    • 用于处理数据持久化逻辑,如数据库操作。
    • 可以是 ORM 库(如 TypeORM、Sequelize)的封装。
  3. 工厂(Factory)

    • 用于动态创建提供者的实例。
    • 可以通过 useFactory 方法定义。
  4. 助手(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 中的提供者。如果你有任何进一步的问题或需要更详细的解释,请随时提问!

最后修改:2024 年 11 月 22 日
如果觉得我的文章对你有用,请随意赞赏