返回

Nest.js 中多种 Provider 注入对象的用法

后端

当然可以,以下是你提供的主题为:使用多种 provider 注入对象 的文章:

在 Nest.js 中,我们可以使用多种方式来注入对象。这使得我们可以很灵活地构建我们的应用程序,并根据需要选择最合适的注入方式。

1. 使用 @Inject() 装饰器

@Inject() 装饰器用于将一个对象注入到另一个对象的构造函数中。这是一种最简单的方法,也是最常用的方法。

例如,假设我们有一个 UserService 类,它需要使用一个 UserRepository 类。我们可以使用 @Inject() 装饰器将 UserRepository 类注入到 UserService 类的构造函数中,如下所示:

import { Injectable } from '@nestjs/common';
import { UserRepository } from './user.repository';

@Injectable()
export class UserService {
  constructor(@Inject(UserRepository) private userRepository: UserRepository) {}

  // ...
}

2. 使用 @Injectable() 装饰器

@Injectable() 装饰器用于标记一个类可以被注入到其他对象中。这是一种更灵活的方式,因为它允许我们在注入时指定更详细的配置。

例如,我们可以使用 @Injectable() 装饰器来指定一个类可以使用多个不同的令牌来注入。这对于需要根据不同的上下文使用不同实例的类非常有用。

import { Injectable, Inject } from '@nestjs/common';

@Injectable()
export class MyService {
  constructor(@Inject('TOKEN_1') private token1: any, @Inject('TOKEN_2') private token2: any) {}

  // ...
}

3. 使用 provide()useClass() 函数

provide()useClass() 函数也可以用于注入对象。这是一种更高级的方式,通常用于更复杂的场景。

例如,我们可以使用 provide()useClass() 函数来注入一个单例对象。这对于需要在整个应用程序中共享的类非常有用。

import { Injectable, Provider } from '@nestjs/common';

const MY_SERVICE_PROVIDER: Provider = {
  provide: 'MY_SERVICE',
  useClass: MyService,
};

@Injectable()
export class MyController {
  constructor(@Inject('MY_SERVICE') private myService: MyService) {}

  // ...
}

4. 使用 useFactory() 函数

useFactory() 函数用于注入一个对象,该对象由一个工厂函数创建。这是一种非常灵活的方式,它允许我们在注入时指定更复杂的逻辑。

例如,我们可以使用 useFactory() 函数来注入一个对象,该对象根据当前的请求上下文创建。这对于需要根据不同的请求创建不同实例的类非常有用。

import { Injectable, Inject } from '@nestjs/common';

const MY_SERVICE_PROVIDER: Provider = {
  provide: 'MY_SERVICE',
  useFactory: (request: Request) => {
    return new MyService(request);
  },
};

@Injectable()
export class MyController {
  constructor(@Inject('MY_SERVICE') private myService: MyService) {}

  // ...
}

结论

Nest.js 提供了多种方式来注入对象。这使得我们可以很灵活地构建我们的应用程序,并根据需要选择最合适的注入方式。