私はカスタムモジュールAuthModule
with AuthService
、AuthController
withルートなどを持っています。これらは正常に動作し、このモジュールを複数のプロジェクト間でパッケージとして共有したいと考えています。問題は、このパッケージからインポートされたAuthService
を拡張する方法と、それに追加のサービスを注入する方法です。
詳細
パッケージに配置するカスタムAuthService
に、クラスUserService
が注入されます。これは、デフォルトでデータベースからUser
データを取得し、クライアント側に返します。データベースからAuthService
追加データを取得する、アプリケーションからのProfileService
などの別のUser
に注入する必要があります。目的は、User
メインデータとUser
追加データをマージし、この束をクライアントに返すことです
これはユースケースの1つです 動的モジュール が作成されました。
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
の独自の配列を構築します) )。
ここには動的モジュールの必要性は本当にありません。
実際、必要なのは、NestJが管理する他のエンティティに注入するサービスがAuthModuleからエクスポートされ、他のエンティティが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 {}
TypeScriptでDependenciesデコレーターを使用しないと構文が短くなる可能性があることを理解していますが、問題の核心は、提供されているモジュールから共有サービスをエクスポートし、それを必要とする他のクラスのモジュールにそのモジュールをインポートすることです。