注:この記事は、nestjsを初めて学習した後のブロガーの知識と理解のみを記録しています。経験はまだ浅く、記事の内容は参照用です。エラーがあれば訂正してください。
制御IOCの反転
この記事では、制御の反転に関する理論的な説明はあまり行いません。
- 基本的な理解:これは、ファクトリパターンの昇華と見なすことができ、オブジェクト参照とオブジェクト作成の間の結合を解くことができます。
- 実装方法:IOCコンテナをグローバルに維持することにより、オブジェクトの構成と作成が一律に管理されます(依存関係の注入)。
IOC作成オブジェクトの場合
1.プロバイダークラス(cats.service.ts)を定義します
通常のプロバイダー、注入された場合の新しいCatsService(httpClient)と同等
import {
Injectable } from '@nestjs/common';
@Injectable()
export class CatsService {
constructor(
private readonly httpClient: HttpClientClass
) {
}
test(): String {
return 'test provider1';
}
}
ジェネリックプロバイダー、注入時に新しいDogsService <HttpClientClass>(httpClient)と同等
- コンストラクターベースの注入
import {
Injectable } from '@nestjs/common';
// 2.多级provider = new DogsService(HttpClientClass1)
@Injectable()
export class DogsService<T>{
constructor(
//@Optional() 可选注入
@Optional() @Inject('HTTP_OPTIONS') private readonly httpClient: T
) {
}
test(): String {
return 'test provider2';
}
}
- 属性ベースの注入
import {
Injectable } from '@nestjs/common';
@Injectable()
export class DogsService<T>{
@Inject('HTTP_OPTIONS')
private readonly httpClient: T;
test(): String {
return 'test provider2';
}
}
2.プロバイダークラスをIOCコンテナー(app.module.ts)に登録します
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 {
}
3. IOCコンテナからプロバイダークラスオブジェクト(cats.controller.ts)を取得します
import {
Controller, Get, Post, Body } from '@nestjs/common';
import {
CatsService } from './cats.service';
@Controller('cats')
export class CatsController {
// provider可通过`constructor` **注入**依赖关系
constructor(private catsService: CatsService) {
}
@Post()
async test() {
this.catsService.test();
}
}