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