メインコンテンツまでスキップ

4. Providers

プロバイダーの役割

プロバイダーは、サービス、リポジトリ、ファクトリー、ヘルパーなど、アプリケーションのロジックやデータアクセスを実装するための基本的なビルディングブロックです。Nest.jsは依存性注入(DI)を使用して、プロバイダーのインスタンスを自動的に管理します。

サービスの作成と使用

サービスは、ビジネスロジックをカプセル化するために使用されます。以下は基本的なサービスの例です:

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];

create(cat: Cat) {
this.cats.push(cat);
}

findAll(): Cat[] {
return this.cats;
}

findOne(id: string): Cat {
return this.cats.find(cat => cat.id === id);
}
}

@Injectableデコレーター

@Injectable()デコレーターは、Nest.jsに対してこのクラスが依存性注入可能であることを示します。これにより、他のクラスでこのサービスを利用できるようになります。

サービスのメソッド

  • create(cat: Cat):新しい猫のデータを作成します。
  • findAll():すべての猫のデータを返します。
  • findOne(id: string):指定されたIDを持つ猫のデータを返します。

ディペンデンシーインジェクション

サービスをコントローラーにインジェクトして使用します。以下の例では、CatsServiceCatsControllerにインジェクトしています。

import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { CatsService } from './cats.service';
import { CreateCatDto } from './create-cat.dto';

@Controller('cats')
export class CatsController {
constructor(private readonly catsService: CatsService) {}

@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}

@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}

@Get(':id')
async findOne(@Param('id') id: string): Promise<Cat> {
return this.catsService.findOne(id);
}
}

コンストラクタインジェクション

コントローラーのコンストラクタでサービスを受け取り、クラスのプロパティとして保存します。これにより、コントローラーのメソッド内でサービスのメソッドを呼び出すことができます。

constructor(private readonly catsService: CatsService) {}

プロバイダーの登録

プロバイダーをモジュールに登録する必要があります。以下の例では、CatsServiceCatsModuleに登録しています。

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}

@Moduleデコレーター

  • controllers:このモジュールに属するコントローラーのリストを定義します。
  • providers:このモジュールに属するプロバイダー(サービス、リポジトリ、ヘルパーなど)のリストを定義します。

カスタムプロバイダー

カスタムプロバイダーを作成することで、既存のクラスに対して特定の依存関係を注入したり、動的にプロバイダーを生成したりできます。以下は基本的なカスタムプロバイダーの例です:

import { Module } from '@nestjs/common';

const customProvider = {
provide: 'CUSTOM_PROVIDER',
useValue: { key: 'value' },
};

@Module({
providers: [customProvider],
})
export class CustomModule {}

カスタムプロバイダーの利用

カスタムプロバイダーを利用するクラスでは、@Injectデコレーターを使用して依存関係を注入します。

import { Inject, Injectable } from '@nestjs/common';

@Injectable()
export class CustomService {
constructor(@Inject('CUSTOM_PROVIDER') private readonly customProvider: any) {}

getCustomValue() {
return this.customProvider.key;
}
}

これで、プロバイダーの基本的な使用方法と登録方法について理解できました。次のセクションでは、モジュールの作成と構成について説明します。