Новый экземпляр на внедрение в 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 через
вспомогательный сервис, подключив
типы к корневому модулю.