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を持つ猫のデータを返します。
ディペンデンシーインジェクション
サービスをコントローラーにインジェクトして使用します。以下の例では、CatsService
をCatsController
にインジェクトしています。
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) {}
プロバイダーの登録
プロバイダーをモジュールに登録する必要があります。以下の例では、CatsService
をCatsModule
に登録しています。
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;
}
}
これで、プロバイダーの基本的な使用方法と登録方法について理解できました。次のセクションでは、モジュールの作成と構成について説明します。