РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
⊗jsnsSpCpUC 3 of 201 menu
◀ ▶

Подмена класса провайдера в 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 получал ответ замены.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить