【NestJS】Module間でDIを実装する方法
はじめに
前回の記事でModule内のServiceとRepositoryのDIについて触れたので、今回はModule間でのDIについてまとめました。
実装
以下のように複数のModuleで構成されたアプリケーションがあった場合、別のModuleからServiceを呼び出すためにどのような実装をすればよいかを考えます。
プロジェクト作成
プロジェクトおよび今回必要となるModule、Service、Controllerを作成します。
$ nest new di
$ nest g module computer
$ nest g module cpu
$ nest g module disk
$ nest g module power
$ nest g service cpu
$ nest g service disk
$ nest g service power
$ nest g controller computer
Module間でのDI
Module内のServiceとRepository間のDIは、それぞれに@Injectable()
デコレータを付加して、Moduleのproviders
にServiceとRepositoryを登録するだけで実装することができました。
一方、別のModule間のService同士でDIを行うには、別の手順を踏む必要があります。
下図を例にすると以下のようになります。
1. 呼び出される側のModule(PowerModule)のexports
にService(PowerService)を登録する
import { Module } from '@nestjs/common';
import { PowerService } from './power.service';
@Module({
providers: [PowerService],
exports: [PowerService],
})
export class PowerModule {}
2. 呼び出す側のModule(CpuModule)のimports
に1のModule(PowerModule)を登録する
import { Module } from '@nestjs/common';
import { PowerModule } from 'src/power/power.module';
import { CpuService } from './cpu.service';
@Module({
imports: [PowerModule],
providers: [CpuService],
})
export class CpuModule {}
3. 呼び出す側のService(CpuService)のconstructorで呼び出される側のService(PowerService)を定義する
import { Injectable } from '@nestjs/common';
import { PowerService } from 'src/power/power.service';
@Injectable()
export class CpuService {
constructor(private powerService: PowerService) {}
compute(a: number, b: number) {
console.log('Drawing 10 watts of power from Power Service');
this.powerService.supplyPower(10);
return a + b;
}
}
PowerModuleとCpuModuleのDIコンテナを図にすると以下のようになります。
CpuModuleでPowerModuleをインポートすることで、PowerModuleのDIコンテナに登録されたリスト(ServiceやServiceとdependencyの関係)がCpuModuleのDIコンテナに登録されます。
NestではModule間のDIがこのようにして行われます。
参考資料
Author And Source
この問題について(【NestJS】Module間でDIを実装する方法), 我々は、より多くの情報をここで見つけました https://qiita.com/suzuki0430/items/0c50dbc9a18b13d95c75著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .