Как внедрить сервис в импортированный сервис Nestjs - PullRequest
0 голосов
/ 07 июня 2018

У меня есть пользовательский модуль AuthModule с AuthService, AuthController с маршрутами и т. Д., Которые работают нормально, и хочу поделиться этим модулем между несколькими проектами в виде пакета.Вопрос в том, как расширить импортируемую AuthService из этого пакета и как внедрить в него дополнительные услуги?

Подробнее

В мой пользовательский AuthService, чтоЯ хочу поместить в пакет, внедренный класс UserService, который по умолчанию получает из базы данных User данные и возвращает их на стороне клиента.Мне нужно вставить в AuthService другой, например ProfileService из приложения, который получает из базы данных User дополнительные данные.Цель состоит в том, чтобы объединить User основные данные и User дополнительные данные и вернуть этот пакет клиенту

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я не вижу здесь необходимости в Динамическом модуле.

Действительно, нужно только, чтобы служба, которую вы хотите внедрить в другую сущность, управляемую NestJs, была экспортирована из вашего AuthModule и AuthModuleимпортированные в Модуль, вы хотите, чтобы другие сущности внедрили ваш AuthService.

import { Module } from '@nestjs/common'
import { AuthService } from './AuthService'

@Module({
  providers: [
    AuthService,
    // ... others
  ],
  exports: [
    AuthService
  ]
})
export class CommonModule {}

Затем в вашем зависимом классе (скажем, другом контроллере, но это может быть что-то вроде GraphQL Resolver, Interceptor или что-то еще), вы объявляетезависимость от AuthService.

import { AuthService } from '../auth/AuthService'
import { Dependencies } from '@nestjs/common'

@Dependencies(AuthService)
export class DependentController {
  constructor (authService) {
    this.authService = authService
  }
}

Наконец, чтобы AuthService был доступен для зависимого контроллера, он должен быть импортирован в тот же модуль, который предоставляется контроллером.

import { Module } from '@nestjs/common'
import { CommonModule } from '../auth/CommonModule'
import { DependentController } from './controller/DependentController'

@Module({
  imports: [
    CommonModule,
    // ...others
  ],
  providers: [
    DependentController,
    // ...others
  ]
})
export class ControllerModule {}

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

0 голосов
/ 07 июня 2018

Это один из вариантов использования Динамические модули были созданы для.

import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';

@Module({
  providers: [Connection],
})
export class DatabaseModule {
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProviders(options, entities);
    return {
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}

В этом примере показано, как providers передается (динамически) модулю результата..

Ваш пакет должен следовать той же схеме: предоставить статический метод, который позволяет создавать DynamicModule, чтобы вы могли разрешать другие ваши службы (внутренние или внешние) по своему усмотрению (создавая собственный массив * 1010).*).

...