web-dev-qa-db-ja.com

インポートしたサービスNestjsにサービスを注入する方法

私はカスタムモジュールAuthModule with AuthServiceAuthController 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の独自の配列を構築します) )。

2
VinceOPS

ここには動的モジュールの必要性は本当にありません。

実際、必要なのは、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デコレーターを使用しないと構文が短くなる可能性があることを理解していますが、問題の核心は、提供されているモジュールから共有サービスをエクスポートし、それを必要とする他のクラスのモジュールにそのモジュールをインポートすることです。

1
Jesús Franco