Внедрение сервиса в сервис в Nest
Пусть карточка собирает данные из двух мест, а оба живут в одном классе. Класс разрастается: он хранит и саму запись, и сведения, которые к ней прилагаются.
Прилагаемые сведения держат в отдельном сервисе. Сервис записи получает его через конструктор и собирает ответ из двух источников. Контроллер знает только сервис записи.
Покажем на примере поста и его автора. Опишем сервис автора с одной операцией имени:
import { Injectable } from '@nestjs/common';
@Injectable()
export class AuthorService {
getName(): string {
return 'Editor';
}
}
Сервис поста примет автора в конструкторе и соберёт строку для карточки:
import { Injectable } from '@nestjs/common';
import { AuthorService } from './author.service.js';
@Injectable()
export class PostService {
constructor(private authorService: AuthorService) {}
getPost(): string {
const title = 'Morning note';
const name = this.authorService.getName();
return `${title} by ${name}`;
}
}
Контроллер запросит готовую строку у сервиса поста:
import { Controller, Get } from '@nestjs/common';
import { PostService } from './post.service.js';
@Controller()
export class PostController {
constructor(private postService: PostService) {}
@Get('post')
getPost(): string {
return this.postService.getPost();
}
}
Оба сервиса и контроллер укажем в корневом модуле:
import { Module } from '@nestjs/common';
import { AuthorService } from './author.service.js';
import { PostController } from './post.controller.js';
import { PostService } from './post.service.js';
@Module({
controllers: [PostController],
providers: [PostService, AuthorService],
})
export class AppModule {}
Сделайте карточку работника
в контроллере WorkerController.
Сведения об отделе берите из сервиса
DepartmentService, а контроллер
пусть спрашивает только сервис
WorkerService. Все три класса
подключите к корневому модулю.