如何将服务注入导入的服务Nestjs

Vit*_*off 7 nestjs

我有AuthModule带有AuthServiceAuthController带有路由等的自定义模块,该模块可以正常工作,并且希望在多个项目之间作为一个软件包共享该模块。问题是如何扩展AuthService从此软件包中导入的内容,以及如何向其中注入其他服务?

更多细节

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

Jes*_*nco 6

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

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

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

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

Run Code Online (Sandbox Code Playgroud)

然后在您的依赖类(假设是另一个控制器,但可以是 GraphQL 解析器、拦截器或其他任何东西)中,声明对 AuthService 的依赖关系。

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

@Dependencies(AuthService)
export class DependentController {
  constructor (authService) {
    this.authService = authService
  }
}
Run Code Online (Sandbox Code Playgroud)

最后,为了使 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 {}
Run Code Online (Sandbox Code Playgroud)

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


Vin*_*OPS 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,
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,了解如何providers(动态)给予结果模块。

您的包应该遵循相同的模式:公开一个允许构建 的静态方法DynamicModule,以便您可以根据需要解析其他服务(内部或外部)(构建您自己的 数组providers)。