NEST.JS - OverView: Providers


Providers

  • ProviderはNestの基本概念です.
  • サービス、Repository、Factory、Helperなどの基本的な最新カテゴリの大部分は、プロフェッショナルと見なすことができます.
  • Providerの主なアイデアは従属関係を注入できることです.
  • すなわち、オブジェクトは互いに異なる関係を確立することができ、ほとんどの「接続」オブジェクトインスタンスの機能は、最近のランタイムシステムに委任することができる.
  • 以前の章では、簡単なCatsControllerを作成しました.
  • コントローラは、HTTP要求を処理し、より複雑なタスクをオペレータに委任する必要があります.
  • プロバイダは、モジュールがproviderとして宣言する一般的なJavaScriptクラスです.
  • Services

  • の簡単なCatsServiceを作成します.
  • このサービスは、データの格納と取得を担当し、CatsControllerで使用するため、Providerとして定義される理想的な選択です.
  • // cats.service.ts
    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;
      }
    }
    ヒント
    CLIを使用してサービスを生成するには、$ nest g service catsコマンドを発行します.
  • CastsServiceは、1つのプロパティと2つのメソッドを持つベースクラスです.
  • の唯一の新機能は@Injectable()レコーダを使用することです.
  • @Injectable()レコーダには、CastsServiceがNest IoCコンテナで管理可能なクラスであることを宣言するメタデータが付属しています.
  • この例では、次のCatインタフェースを使用します.
    // interfaces/cat.interface.ts
    export interface Cat {
      name: string;
      age: number;
      breed: string;
    }
  • には現在、猫を検索するためのサービスクラスがあり、CatsControllerで使用されています.
  • // cats.controller.ts
    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();
      }
    }
  • CastsServiceはクラス構造関数によって注入される.
  • プライベート構文の使用に注目します.
  • 略語を使用すると、catsServiceメンバーを同じ場所ですぐに宣言して初期化できます.
  • Dependency injection

  • Nestは強力な設計モデルに基づいて構築され、通常は依存注入である.
  • 公式のAngularドキュメントでは、この概念に関する優れた記事を読むことが望ましい.
  • Nestでは、タイプスクリプト機能が依存関係を解決するため、管理が非常に容易です.
  • 次の
  • の例では、NestはcatsServiceを解決するためにCatsServiceインスタンスを作成して返します.(一般的には、他の場所から既存のインスタンスを要求すると、単一のトンが返される)
  • この依存関係は解決され、コントローラの作成者(または表示された属性に割り当てられた)に渡されます.
  • constructor(private catsService: CatsService) {}

    Scopes

  • プローブは、通常、アプリケーションのライフサイクルに同期したライフサイクル(「範囲」)を有する.
  • アプリケーションは、ブートストラップですべての相関を解決する必要があるため、すべてのプローブをインスタンス化する必要があります.
  • と同様に、アプリケーションが閉じた場合、各プローブは削除されます.
  • しかし、従業員のライフサイクルをリクエストの範囲内に制限する方法もあります.
  • これらの技術の詳細については、ここです。を参照してください.

    Custom providers

  • Nestには、Provider間の関係を解決するために内蔵された制御反転(「IoC」)コンテナがあります.
  • この機能は、上述した依存注入機能の基礎であるが、実際にはこれまでに説明したよりもはるかに強力である.
  • プローブを定義する方法は様々である.通常の値、クラス、非同期または同期ファクトリを使用できます.
  • Optional providers

  • の場合、必ずしも解決すべきでない従属関係がある可能性がある.
  • たとえば、クラスは構成オブジェクトに属することができますが、渡されない場合はデフォルト値を使用する必要があります.
  • の場合、構成プログラムがなくてもエラーが発生しないため、依存関係はオプションです.
  • プレースホルダがオプションであることを示すには、ジェネレータの署名に@Optional()Decoratorを使用します.
  • import { Injectable, Optional, Inject } from '@nestjs/common';
    
    @Injectable()
    export class HttpService<T> {
      constructor(@Optional() @Inject('HTTP_OPTIONS') private httpClient: T) {}
    }
  • の例では、カスタムプローブが使用されるので、HTTP OPTIONSカスタムタグが含まれる.
  • 以前の例では、コンストラクタのクラスを介して依存関係を表すコンストラクタベースの注入が示されている.
  • Custom Providerおよび関連タグの詳細については、後ほど整理します.
  • Property-based injection

  • で現在使用されている技術を生成者ベース注入と呼ぶ.
  • Providerはジェネレータ方式で注入されるからです.
  • は、非常に特定の場合に、属性ベースの注入が有用である可能性がある.
  • たとえば、最上位レベルが1つ以上のproviderに依存している場合、ジェネレータのサブクラスからsuper()を呼び出してすべてのproviderを渡すのは退屈かもしれません.これを防止するために、@Inject()レコーダを属性レベルで使用できます.
    import { Injectable, Inject } from '@nestjs/common';
    
    @Injectable()
    export class HttpService<T> {
      @Inject('HTTP_OPTIONS')
      private readonly httpClient: T;
    }
  • クラスが他のProviderを拡張しない場合は、常にジェネレータベースの注入を使用します.
  • Provider registration

  • は現在、仕入先を定義し、サービスの消費者を特定しているので、注入を実行するために「次のステップ」にサービスを登録する必要があります.
  • モジュールファイル(app.module.ts)を編集し、@Module()Decoratorのプロバイダ配列にサービスを追加して実行します.
  • // app.module.tsJS
    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クラスの相関を解決できるようになりました.
  • の下には、私たちのディレクトリ構造の表現があります.
  • src	|
    	|cats
    	|	|dto
    	|		|create-cat.dto.ts
    	|	|interfaces
    	|		|cat.interface.ts
    	|	|cats.controller.ts
    	|	|cats.service.ts
    	|app.module.ts
    	|main.ts

    Manual instantiation

  • は、これまでNestが依存関係解決の大部分の詳細を自動的に処理する方法を議論してきた.
  • の特定の場合、内蔵された依存注入システムから離れ、プローブを手動で検索またはインスタンス化する必要がある場合がある.
  • この2つのトピックについて簡単に説明します.
  • 既存のインスタンスまたはダイナミックインスタンス化Providerをインポートするには、モジュールリファレンスを使用します.
  • ブート()関数からプログラムをインポートするには(たとえば、コントローラのない独立したアプリケーションまたはブートで構成サービスを利用する場合)、独立したアプリケーションを参照してください.