NestJSでinterfaceに対してDIする

22534 ワード

NestJSはmoduleクラス周りでのDIの実装がとても優れているなと感じており、moduleクラスによって依存関係がまとまるので、可読性も高いなと感じています。

そんな中で1点、特定のクラスに対してinterfaceを噛ませて実装したいと思った時に、少し詰まったので、それの解決策です。

やりたいこと

DemoServiceに対して、DemoRepositoryInterfaceを実装したDemoRepositoryをDIしたい。

demo.service.ts
import { Injectable } from '@nestjs/common';
import { DemoRepositoryInterface } from './demo.repository.interface';

@Injectable()
export class DemoService {
  constructor(
    private readonly demoRepository: DemoRepositoryInterface,
  ) {}

  // その他メソッドなど...
}

interfaceを噛ませないで書いてみる

interfaceを噛ませないのであれば簡単です。

demo.service.ts
import { Injectable } from '@nestjs/common';
import { DemoRepository } from './demo.repository';

@Injectable()
export class DemoService {
  constructor(
    private readonly demoRepository: DemoRepository,
  ) {}

  // その他メソッドなど...
}
demo.service.ts
import { Module } from '@nestjs/common';
import { DemoController } from './demo.controller';
import { DemoService } from './demo.service';
import { DemoRepository } from './demo.repository';

@Module({
  controllers: [DemoController],
  providers: [DemoService,DemoRepository],
})
export class DemoModule {}

NestJSのドキュメントに記載されているstandard providers という方法を使えば、実装が可能です。