我的自定义模块r,s
包含AuthModule
,AuthService
包含路由等等,工作正常,并且希望在多个项目之间作为包共享此模块。问题是如何从这个包中扩展导入的AuthController
以及如何向其中注入额外的服务?
更多详情
我希望放入包中的自定义AuthService
注入类AuthService
,默认情况下会从数据库中获取一些UserService
数据并将其返回给客户端。我需要从应用程序注入User
另一个,例如来自数据库AuthService
的额外数据ProfileService
。目的是合并User
主数据和User
额外数据,并将此数据返回给客户
答案 0 :(得分:1)
这是为其创建的用例Dynamic Modules之一。
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
的静态方法,以便您可以根据需要解析其他服务(内部或外部)(构建自己的{{1}数组})。
答案 1 :(得分:0)
我认为这里真的不需要动态模块。
实际上,仅需要将要注入到NestJs管理的其他实体中的服务从AuthModule中导出,并将AuthModule导入到想要其他实体注入了AuthService的Module中。
import { Module } from '@nestjs/common'
import { AuthService } from './AuthService'
@Module({
providers: [
AuthService,
// ... others
],
exports: [
AuthService
]
})
export class CommonModule {}
然后在您的依赖类中(假设是另一个Controller,但可以是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 {}
我知道语法可能会更短,并且不会在打字稿中使用Dependencies装饰器,但是问题的核心是从提供的模块中导出共享服务,然后将该模块导入需要它的其他类中。