nest正式ドキュメントプロバイダ


Providers


これはNestの最も基本的な概念であり,最も基本的な考え方は注入に依存するDIに基づいている.
コントローラはHttp要求を処理し,複雑な依頼はproviderに与える.
providerはクラスで、モジュールにのみproviderとして登録されます.

SOLIDの原則

  • S(単一応答原則)RP 1クラスは1つの責任しか負いません.
  • O(pen/closed principle)CP拡張はオープンですが、変更は閉じている必要があります.正常に動作する元のコードを変更する必要はありません.新しいコードを追加することで機能と変更を追加します.新しいコードを追加するか、コードを追加せずに機能を拡張または変更できます.
  • L(iskov置換原理)SPプログラムオブジェクトは、精度を損なわずにサブタイプのインスタンスに変換できる必要がある.class fruitextends appleの場合、appleインスタンスをfruitインスタンスに渡すことができるのと同様です.これは、「オープン/クローズの原則」に関連しています.
  • I(インターフェース分離原則)SPインターフェース分離原則.複数の特定のクライアントインタフェースは、汎用インタフェースよりも優れています.クライアントは、自分が使用しない方法に依存してはいけません.考えてみれば、インタフェースに勝手に名前をつけないでください.
  • D(依存反転原則)逆転IP依存関係の原則
    抽象=>具体=>抽象=>具体的な順序ではなく、具体的な感覚.親モジュールは子モジュールに依存することはできませんが、親モジュールと子モジュールは抽象化する必要があります.これは、親=>子クラスで親クラスを変更すると、子クラスが正常に動作しないため、親=>抽象=>子クラスまたは抽象=>親、子クラスに変更する必要があるオープンクローズの原則にも似ています.
    これはDIに関する原則です.ここにNestとの共通点があります
  • Providerに戻ります。


    @Injectable()レコーダをクラスの前に配置します.この場合、メタデータが貼り付けられ、Nest IOCがCatServiceクラスを制御します.
    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;
    }
    コントローラのコンストラクション関数にCatServiceを入れて、コントローラに登録して使用します.
    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();
      }
    }
    
    重要な点は、プライベート演算子として処理することです.そう略すと、宣言やメンバーを追加する過程がわかります.

    Dependency Injection


    Angularの影響を受ける
    依存は、機能を実行するために必要なオブジェクトまたはサービスです.
    設計モードは、依存関係を作成するのではなく、外部ソースに依存します.
    AngularのDIフレームワークは,インスタンス作成時にクラスに依存関係を注入することによってDIを実現する.これはNestが正しくインポートしたものです
    TSを書くときはtypeのみを使用して依存項目を管理します.
    Singletonモデルを使用してサービスインスタンスを作成するか、または別の場所からサービスインスタンスを作成します.
    Scope
    プロバイダはアプリケーションと同じライフサイクルを持つため、アプリケーションが起動すると、すべてのプロバイダをインスタンス化する必要があります.アプリケーションが終了するときは、すぐに終了する必要があります.
    もう一つの特殊なscopeは、単注鏡と呼ばれています.
    Inversion of Control
    Nestにはサプライヤー間の関係を解決するIoCコンテナが内蔵されています.
    プロバイダは次のとおりです.
    1. plain value
    2. classes
    3. async,sync factories
    同じものを入れることができます.
    Optional provider
    解析しなければならない依存でない場合は@Optionalを貼り付けることができます.代表的なのはconfiguration objectです.default値があり、オプション値がある場合は、この値を使用して置き換えます.
    import { Injectable, Optional, Inject } from '@nestjs/common';
    
    @Injectable()
    export class HttpService<T> {
      constructor(@Optional() @Inject('HTTP_OPTIONS') private httpClient: T) {}
    }
    Property based injection
    ほとんどはコンストラクション関数ベースの注入を用いるが,属性ベースの注入を用いる場合がよい.
    import { Injectable, Inject } from '@nestjs/common';
    
    @Injectable()
    export class HttpService<T> {
      @Inject('HTTP_OPTIONS')
      private readonly httpClient: T;
    }
    
    top-levelクラスにproviderがある場合はsuperで行うことは推奨されません.この場合、propertyレベルでInjectキーを書き込むことができます.
    クラスが他のプロバイダを拡張しない場合は、constructorベースの
    Provider Registration
    モジュールにプロバイダセクションを登録できます.