返回

在 NestJS 中使用 Providers 自定义和动态生成组件

后端

NestJS 中的 Providers

在 NestJS 中,Providers 是一个重要的概念,它允许我们定义和管理应用程序中的组件。Providers 可以是服务、控制器、模块等。通过使用 Providers,我们可以将组件注册到应用程序上下文中,以便在整个应用程序中使用。

自定义 Providers

要自定义 Provider,我们可以使用 @Injectable() 装饰器。这个装饰器将告诉 NestJS,这个类是一个可注入的依赖项。例如:

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

@Injectable()
export class MyService {
  // ...
}

现在,我们就可以在其他组件中使用这个服务了。例如:

import { Injectable } from '@nestjs/common';
import { MyService } from './my-service';

@Injectable()
export class MyController {
  constructor(private readonly myService: MyService) {
    // ...
  }

  // ...
}

动态生成 Providers

除了自定义 Providers 之外,我们还可以动态生成 Providers。这在某些情况下非常有用,例如,当我们想要根据某些条件来创建不同的组件时。

要动态生成 Provider,我们可以使用 @DynamicModule() 装饰器。这个装饰器允许我们定义一个动态模块,其中包含要动态生成的组件。例如:

import { Injectable, DynamicModule, Module } from '@nestjs/common';
import { MyService } from './my-service';

@Injectable()
export class MyDynamicService {
  // ...
}

@Module({
  providers: [
    {
      provide: 'MY_DYNAMIC_SERVICE',
      useClass: MyDynamicService,
    },
  ],
})
export class MyDynamicModule {
  static forRoot(): DynamicModule {
    return {
      module: MyDynamicModule,
      providers: [
        {
          provide: 'MY_DYNAMIC_SERVICE',
          useClass: MyDynamicService,
        },
      ],
    };
  }
}

现在,我们就可以在其他组件中使用这个动态生成的组件了。例如:

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

@Injectable()
export class MyController {
  constructor(@Inject('MY_DYNAMIC_SERVICE') private readonly myDynamicService: MyDynamicService) {
    // ...
  }

  // ...
}

生命周期和作用域

在 NestJS 中,每个 Provider 都有一个生命周期和一个作用域。生命周期决定了组件的实例化和销毁时间,而作用域决定了组件可以在哪里使用。

生命周期

NestJS 中有三种生命周期:

  • Transient: 每次请求都会创建一个新的组件实例。
  • RequestScoped: 每个请求都会创建一个新的组件实例,但是在同一个请求中,该组件实例会被重用。
  • Singleton: 只创建一个组件实例,并且在整个应用程序生命周期中都会重用。

作用域

NestJS 中有四种作用域:

  • Global: 组件可以在整个应用程序中使用。
  • Request: 组件只能在当前请求中使用。
  • Transient: 组件只能在当前方法中使用。
  • Custom: 自定义作用域,可以通过 @Scope() 装饰器来定义。

总结

在本文中,我们介绍了 NestJS 中 Providers 的概念,以及如何使用它们来自定义和动态生成组件。我们还介绍了如何使用不同的生命周期策略和作用域选项来管理组件的实例化和销毁。