Q
ProvidersとModuleの違いは?
Provider:機能を提供するもの。注入可能。
Module:Providerをまとめたもの
Q
何故、ModuleのControllersプロパティにControllerをセットするとexportsプロパティにセットしなくても使えるのか?
コントローラーはアプリケーション全体で自動的に解決されそのルートはすべてのモジュールから利用可能になるため
Q
Moduleのプロパティの種類、使い分けは?
imports:他のプロバイダ、モジュールがエクスポートしたプロバイダ、モジュールを利用するためにインポートするリスト
controllers:現在のモジュールに含まれるコントローラーのリスト
providers:現在のモジュールで提供され(場合によってエクスポートされる)他のモジュールから注入できるプロバイダのリスト
exports:現在のモジュールが他のモジュールに公開するプロバイダのリスト
Q
Dependency Injection(DI)依存性注入とは
インターフェイスだけ用意し必要に応じて外部からクラス(依存性のあるもの)などを提供(注入)する
Q
DIトークンとは?
コード内でユニークな識別子(定数文字列等)
特定の依存関係を注入するために使われるキー
//サンプル
@NgModule({
providers: [
// このトークンに対して特定の値を提供します。
{ provide: MY_DI_TOKEN, useValue: 'Hello World' }
],
...
})
export class AppModule { }
// 後でこのトークンを使って依存性を注入できます。
constructor(@Inject(MY_DI_TOKEN) private value: string) {
console.log(this.value); // "Hello World"
}
Q
providerの定義の仕方
@Module({
providers: [ // providers配列で依存関係注入(DI)プロバイダを定義します。
{
provide: 'ASYNC_CONNECTION', // 'ASYNC_CONNECTION'というトークン用のプロバイダを定義します。
useFactory: async (configService: ConfigService) => { // useFactoryは非同期接続を作成するための工場(ファクトリー)関数を提供します。
const config = await configService.getConfig(); // 設定サービスから設定を取得します。
return await YourService(config); // 取得した設定を使用して接続を作成します。
},
inject: [ConfigService], // Factory関数で必要な依存関係を注入します。ここではConfigServiceが必要とされます。
},
],
})
export class AppModule {} // AppModuleというモジュールをエクスポートします。
注入されるサービスは`Injectale()デコレータで装飾する必要がある
import { Injectable } from '@nestjs/common';
@Injectable()
export class YourService {
private connection: Promise<Connection>;
// ...
}