nest正式ドキュメントプロバイダ
Providers
これはNestの最も基本的な概念であり,最も基本的な考え方は注入に依存するDIに基づいている.
コントローラはHttp要求を処理し,複雑な依頼はproviderに与える.
providerはクラスで、モジュールにのみproviderとして登録されます.
SOLIDの原則
抽象=>具体=>抽象=>具体的な順序ではなく、具体的な感覚.親モジュールは子モジュールに依存することはできませんが、親モジュールと子モジュールは抽象化する必要があります.これは、親=>子クラスで親クラスを変更すると、子クラスが正常に動作しないため、親=>抽象=>子クラスまたは抽象=>親、子クラスに変更する必要があるオープンクローズの原則にも似ています.
これは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
モジュールにプロバイダセクションを登録できます.
Reference
この問題について(nest正式ドキュメントプロバイダ), 我々は、より多くの情報をここで見つけました https://velog.io/@presentsong/nest-공식문서-Providersテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol