Providers


「最近」の基本カテゴリには、「サービス」、「Repository」、「Factory」、「Helper」などがあり、「プロバイダ」とみなされます.
提供者の主な考え方は,従属関係を注入できることである.
すなわち、オブジェクトは互いに異なる関係を作成することができ、ほとんどの場合、オブジェクトインスタンスを最近のランタイムシステムに関連付けます.

コントローラはHTTPリクエストを処理し、より複雑なタスクをプロバイダに委任します.
Providerは、モジュールでproviderと宣言されている一般的なJavaScriptクラスです.
このようにNestjsはオブジェクト向けのプログラミングが可能であり,SOLIDの原則に従うことが望ましい.

Services

CatsServiceを例に挙げます.
このサービスはデータの保存と取得を担当し、CatsController用に設計されています.
プロバイダの一種.
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;
  }
}
export interface Cat {
  name: string;
  age: number;
  breed: string;
}
このサービスは、1つのプロパティと2つのメソッドを持つベースクラスです.@Injectable()デコーダは、サービスがNest IoCコンテナによって管理可能なクラスであることを示すサービスをメタデータに添付する.(Nest管理)
このサービスクラスは、Catインターフェースを使用する.CatsControllerで使用されます.
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

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

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

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}
CatsServiceはジェネレータを介して注入される.privateキーワードを使用すると、宣言と同時にCatsServiceを初期化できます.

Optional Providers


クラスは依存関係に注入できますが、渡されていない場合はデフォルト値を使用する必要があります.
この場合、プロバイダがなくてもエラーが発生しないように、ユーザに依存関係を選択させることができる.
プロバイダがオプションである場合、@Optional()データレコーダは、ジェネレータの識別において使用することができる.
import { Injectable, Optional, Inject } from '@nestjs/common';

@Injectable()
export class HttpService<T> {
  constructor(@Optional() @Inject('HTTP_OPTIONS') private httpClient: T) {}
}
上記の例では、HTTP_OPTIONS Custom Tokenを含むCustom Providerを使用します.

Property-based Injection


これまで用いられてきた技術は,プロバイダが構造関数法により注入するため,構造関数に基づく注入と呼ばれている.
特殊な場合には、それ以外にも属性ベースの注入方式を用いることができる.
たとえば、最上位クラスが1つ以上のプロバイダに依存している場合、生成者のサブクラスからsuper()を呼び出してすべてのプロバイダを渡すことは無効である可能性があります.このため、@Inject()データレコーダは、属性レベルで使用することができる.
import { Injectable, Inject } from '@nestjs/common';

@Injectable()
export class HttpService<T> {
  @Inject('HTTP_OPTIONS')
  private readonly httpClient: T;
}

Provider Registration


プロバイダが定義され、サービスを使用するコントローラが確保されたため、注入を実行するために「次へ」にサービスを登録する必要があります.モジュールファイルを編集し、@Module()デコーダのprovidersアレイにサービスを追加します.
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class AppModule {}
NestはCatsControllerクラスの従属関係を解決できるようになった.(CatsController DI CatsServiceなのでモジュールに登録します)
このようにすると、ディレクトリ構造は次のようになります.

リファレンス


https://docs.nestjs.kr/providers