如何在Nestjs中控制器的构造函数中注入服务的接口?

Jua*_*tín 9 nestjs

我有一个应用程序,它接收一个服务作为对控制器的依赖,到目前为止一切都很好,但我想找到一种方法,而不是声明该服务的具体实现,以便能够从控制器“询问”该服务实现的接口,用于解耦该服务的具体实现。在 Nest js 中这是如何完成的?

Jas*_*ite 14

为此,您必须为您的界面创建一个注入令牌,并@Inject()在注入服务时将装饰器与注入令牌一起使用。然后在您的模块中,您可以声明为该注入令牌提供哪个实现。

下面是一个简单的问候服务接口和我们的注入令牌,它将在将我们的服务注册为提供商时使用。

问候服务.interface.ts

// This will be our injection token.
export const GREETING_SERVICE = 'GREETING SERVICE';

export interface IGreetingService {
  greet(name: string): Promise<string>;
}
Run Code Online (Sandbox Code Playgroud)

将实现我们的问候界面的基本服务......

专业问候语.service.ts

// This will be our injection token.
export const GREETING_SERVICE = 'GREETING SERVICE';

export interface IGreetingService {
  greet(name: string): Promise<string>;
}
Run Code Online (Sandbox Code Playgroud)

还有我们的问候模块,我们使用令牌注册我们的服务......

问候语模块.ts

import { Injectable } from '@nestjs/common';
import { IGreetingService } from './greeting-service.interface';

@Injectable()
export class ProfessionalGreetingService implements IGreetingService {
  public async greet(name: string): Promise<string> {
    return `Hello ${name}, how are you today?`;
  }
}

Run Code Online (Sandbox Code Playgroud)

现在,当我们注入服务时,我们可以将@Inject()装饰器与注入令牌一起使用。useClass无论您在我们的系统中提供了哪种实现,都GreetingModule将被注入......

问候语.controller.ts

import { Module } from '@nestjs/common';
import { ProfessionalGreetingService } from './services/professional-greeting.service';
import { GREETING_SERVICE } from './services/greeting-service.interface';
import { GreetingController } from './controllers/greeting.controller';

@Module({
  providers: [
    {
      // You can switch useClass to different implementation
      useClass: ProfessionalGreetingService,
      provide: GREETING_SERVICE
    }
  ],
  controllers: [
    GreetingController
  ]
})
export class GreetingModule {}
Run Code Online (Sandbox Code Playgroud)

https://jasonwhite.xyz/posts/2020/10/20/nestjs-dependency-injection-decoupling-services-with-interfaces/

https://github.com/jmw5598/nestjs-di-decoupling-with-interfaces https://docs.nestjs.com/fundamentals/custom-providers