Получение развязанных модулей в NestJS - PullRequest
0 голосов
/ 14 января 2020

Я не могу понять, как использовать внедрение зависимостей в Nest JS по своему вкусу.

Вот моя структура проекта:

App --- User ------ Common
  \ \-- Article --/
   \--- Chat

Словами: один большой Модуль приложения является приложением. Функциональные модули user, article и chat. Теперь, если какая-то функция хочет взаимодействовать с другой, она должна зависеть от модуля common.

В моем простом случае это будет: База данных статьи имеет простой объект об авторе. Поэтому, как только он получает данные статьи, он хочет получить данные автора (пользователя). Но он не должен видеть на user модуле.

Мое решение состояло в том, чтобы иметь service интерфейсы в общем модуле.

export interface UserCommonService {
    getUser(id: string): Promise<User | null>
}

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

@Injectable()
export class UserService implements UserCommonService {
  async getUser(id: string): Promise<User | null> {
    ...
  }
}

@ApiTags("v1/article")
@Controller("v1/article")
export class ArticleController {
  constructor(
    private readonly articleService: ArticleService,
    @Inject('UserService') private readonly userService: UserCommonService
  ) { }

  @Get(":id")
  async getArticle(@Param("id") id: string): Promise<...> {
    const article = await this.articleService.getArticle(id)
    const user = await this.userService.getUser(article.author.id)

    return {author: user, article: article}
  }
}

Теперь я теряюсь в том, что делать в модулях DI, чтобы сделать эту работу. Насколько я знаю, я поставил следующее в user.module.ts

@Module({
  imports: [TypegooseModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService, { provide: 'UserService', useClass: UserService }],
  exports: ['UserService']
})

Но я не знаю, что вставить в article.module, чтобы импортировать его. Или, может быть, app.module? Все, что я делаю, приводит к ошибке или не возможно - как импорт не может иметь строковое значение. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 14 января 2020

Две вещи:

В вашем user.module.ts у вас должно быть только UserService в массиве провайдеров только один раз и экспортировано, например, так:

@Module({
  imports: [TypegooseModule.forFeature([User])],
  controllers: [UserController],
  providers: [{ provide: 'UserService', useClass: UserService }],
  exports: ['UserService']
})
export class UserModule {}

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

Тогда в вашем article.module.ts, чтобы учесть @Inject('UserService'), вам просто нужно импортировать UserModule вроде так

@Module({
  imports: [UserModule, TypegooseModule.forFeature([Article]),
  controller: [ArticleController],
  providers: [ArticleService]
})
export class ArticleModule {}

И Nest не должен жаловаться на какие-либо ошибки по этому поводу. Дайте мне знать, если у вас возникнут проблемы

...