Использование сервиса из внедренного модуля — NestJS

#javascript #typescript #nestjs

#javascript #typescript #nestjs

Вопрос:

Я пытаюсь использовать сервис из модуля services в главном контроллере приложений с каркасами в NestJS.

Это работает — helloWorldsService.message отображает ожидаемое приветствие в методе @Get — но импорт HelloWorldsService в app.module и app.controller кажется избыточным и, похоже, нарушает инкапсуляцию сервисов модулем services.

Правильно ли я это понимаю, так ли вы используете скрытый сервис из другого модуля, или я что-то упускаю? Причина, по которой я спрашиваю: если это правильно, и вам нужно напрямую ссылаться на другие классы (например, ссылаться на HelloWorldService непосредственно в контроллере), тогда мне трудно понять, почему кто-то беспокоится о свойствах providers / imports объявления @Module .

 import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { RouterModule } from './router/router.module';
import { ServicesModule } from './services/services.module'; //<-- import service MODULE
import { EventsModule } from './events/events.module';
import { HelloWorldsService } from './services/hello-worlds/hello-worlds.service'; //<-- import service module SERVICE


@Module({
  imports: [RouterModule, ServicesModule, EventsModule],
  controllers: [AppController],
  providers: [AppService, HelloWorldsService],
})
export class AppModule {}


//Controller code:
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
import { HelloWorldsService } from './services/hello-worlds/hello-worlds.service'; //<-- importing service again in consuming controller

@Controller()
export class AppController {
  constructor(private readonly appService: AppService, private readonly helloWorldsService: HelloWorldsService ) {}

    @Get()
    getHello(): string {
        return this.helloWorldsService.Message();
    }
}


//services.module
import { Module } from '@nestjs/common';
import { WagerAccountService } from './wager-account/wager-account.service';
import { WagerAccountHttpService } from './wager-account.http/wager-account.http.service';
import { CustomerIdentityHttpService } from './customer-identity.http/customer-identity.http.service';
import { HelloWorldsService } from './hello-worlds/hello-worlds.service';

@Module({
    exports:[HelloWorldsService],
  providers: [CustomerIdentityHttpService, WagerAccountService, WagerAccountHttpService, CustomerIdentityHttpService, HelloWorldsService]
})
export class ServicesModule {}
 

Ответ №1:

Если вы хотите использовать некоторые сервисы в другом сервисе, существуют разные способы, в зависимости от вашей цели. Например: у вас есть App1Service и App1Module , App2Service и App2Module и хотите использовать App2Service в App1Service

  1. Вы можете использовать providers
 // App1Module.ts
@Module({
 imports: [],
 controllers: [App1Controller],
 providers: [App1Service, App2Service], // only service is imported here
})
export class App1Module {}
 
  1. Импортируйте полностью Module , но не забывайте export о службе
 // App1Module.ts
@Module({
 imports: [App2Module], // Full Module is imported here
 controllers: [App1Controller],
 providers: [App1Service], // No need to use service import here but need to export App2Module services
})
export class App1Module {}
 

App2Service ДОЛЖЕН быть экспортирован в App2Module

 // App2Module.ts
@Module({
  imports: [],
  controllers: [App2Controller],
  providers: [App2Service],
  exports: [App2Service] // this service is exported and available in other services
})
export class App2Module {}
 

Если у вас есть какая-то зависимость от App2Module других модулей, например App3Module , и вы хотите использовать App3Service in App1Service , вам следует использовать вариант 2. Экспортировать App3Service в App3Module , и он будет автоматически доступен для App1Service . Вот как это работает:

  1. Вы экспортируете App3Service в App3Module
  2. Вы импортируете App3Module в App2Module
  3. Вы импортируете App2Module в App1Module

Комментарии:

1. спасибо @BidzinaAivazashvili. Я экспортирую сервис в service.module и импортирую модуль в класс AppModule. Итак, это работает… мне просто кажется, что у меня есть операторы импорта в моем классе AppModule для импортированных модулей и сервисов, а также операторы импорта в моем контроллере-потребителе. Вы говорите, что это нормально?

2. @monkeydeus Когда вы говорите «импортировать инструкции в мой потребляющий контроллер», вы имеете в виду внедрение зависимостей в свой конструктор контроллера?