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

Новый экземпляр на внедрение в Nest

Иногда один и тот же тип нужен сразу нескольким получателям, но общий синглтон им мешает. Даже область запроса не помогает, если нужны разные объекты внутри одного обращения.

Кратковременная область создаёт новый экземпляр на каждое внедрение. Контроллер и соседний сервис, которые запрашивают один тип, получат разные объекты, хотя запрос один и тот же.

Правило снова задают в @Injectable через Scope. Чтобы разница была видна в ответе, сравним метки времени из двух внедрений.

Покажем на примере постов. Сервис запомнит момент создания:

import { Injectable, Scope } from '@nestjs/common'; @Injectable({ scope: Scope.TRANSIENT }) export class PostService { born = Date.now(); getBorn(): string { return String(this.born); } }

Вспомогательный сервис тоже запросит тот же тип, а контроллер сравнит обе метки в одном ответе:

import { Injectable } from '@nestjs/common'; import { PostService } from './post.service.js'; @Injectable() export class PostMetaService { postService: PostService; constructor(postService: PostService) { this.postService = postService; } getBorn(): string { return this.postService.getBorn(); } }

Контроллер вернёт две метки через запятую:

import { Controller, Get } from '@nestjs/common'; import { PostMetaService } from './post-meta.service.js'; import { PostService } from './post.service.js'; @Controller('posts') export class PostController { postService: PostService; postMetaService: PostMetaService; constructor( postService: PostService, postMetaService: PostMetaService, ) { this.postService = postService; this.postMetaService = postMetaService; } @Get() getPosts(): string { const own = this.postService.getBorn(); const nested = this.postMetaService.getBorn(); return `${own}, ${nested}`; } }

Все три типа регистрируем в корневом модуле:

import { Module } from '@nestjs/common'; import { PostController } from './post.controller.js'; import { PostMetaService } from './post-meta.service.js'; import { PostService } from './post.service.js'; @Module({ controllers: [PostController], providers: [PostService, PostMetaService], }) export class AppModule {}

Сделайте WorkerService с кратковременной областью и сравните две метки в WorkerController через вспомогательный сервис, подключив типы к корневому модулю.

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