Псевдоним провайдера в Nest
Один и тот же сервис иногда нужен под разными именами: по классу в одном месте и по строке в другом. Второй объект создавать не хотят.
Приём useExisting не
строит новый экземпляр, а
указывает на провайдер,
уже записанный в модуле.
Поле provide задаёт
псевдоним, useExisting -
исходный токен. Внедрение
по строке и по классу тогда
даёт один и тот же объект.
Покажем на примере постов. Опишем сервис списка:
import { Injectable } from '@nestjs/common';
@Injectable()
export class PostService {
getPosts(): string {
return 'All posts';
}
}
Зарегистрируем сервис и строковый псевдоним в модуле:
import { Module } from '@nestjs/common';
import { PostController } from './post.controller.js';
import { PostService } from './post.service.js';
@Module({
controllers: [PostController],
providers: [
{
provide: PostService,
useClass: PostService,
},
{
provide: 'LIST',
useExisting: PostService,
},
],
})
export class AppModule {}
Контроллер возьмёт сервис по псевдониму и по типу - это один объект:
import { Controller, Get, Inject } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller('posts')
export class PostController {
list: PostService;
postService: PostService;
constructor(
@Inject('LIST') list: PostService,
postService: PostService,
) {
this.list = list;
this.postService = postService;
}
@Get()
getPosts(): string {
return this.list.getPosts();
}
}
Свяжите строковый псевдоним
с WorkerService
и верните список из
WorkerController
по этому имени.