11

我有自定义模块,AuthModule带有路由等,工作正常,并希望在几个项目之间共享这个模块作为一个包。问题是如何扩展从这个包导入的以及如何在其中注入额外的服务?AuthServiceAuthControllerAuthService

更多细节

AuthService在我想要放入包中的自定义中,注入了类UserService,默认情况下从数据库中获取一些User数据并将其返回到客户端。我需要注入AuthService另一个,例如ProfileService从应用程序中,从数据库User额外数据中获取。目的是合并User主要数据和User额外数据,并将这组数据返回给客户端

4

2 回答 2

5

我认为这里不需要动态模块。

实际上,只需要从您的 AuthModule 中导出您想要注入到由 NestJs 管理的其他实体的服务,并在您希望其他实体注入您的 AuthService 的模块中导入 AuthModule。

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

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

然后在您的依赖类(假设是另一个控制器,但可以是 GraphQL 解析器、拦截器或其他任何东西)中,您声明对 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 {}

我知道语法可以更短,并且在打字稿中不使用依赖装饰器,但是问题的核心是从它提供的模块中导出共享服务,然后将该模块导入到模块中其他需要它的类中。

于 2019-01-23T17:09:14.730 回答
3

这是创建动态模块的用例之一。

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,因此您可以根据需要解析其他服务(内部或外部)(构建您自己的数组providers)。

于 2018-06-07T10:11:53.633 回答