nestjs、依賴注入 、provider 筆記

nest概念

module (模塊)
按業(yè)務(wù)邏輯劃分的基本單元,包含控制器和服務(wù)??刂破魈幚碚埱蠛晚憫?yīng)數(shù)據(jù),服務(wù)處理實(shí)際業(yè)務(wù)邏輯。

Middleware(中間件)
是路由處理前的數(shù)據(jù)處理層,只能在模塊或者全局注冊,可以做日志處理,用戶認(rèn)證等處理

Guard(守衛(wèi))
是決定請求是否可以到達(dá)對應(yīng)的路由的處理器,可以做角色守衛(wèi)

Pipe (管道)
是數(shù)據(jù)流處理,在中間件后路由處理前做數(shù)據(jù)處理,可以做數(shù)據(jù)驗(yàn)證,數(shù)據(jù)轉(zhuǎn)換等數(shù)據(jù)處理

Interceptor(攔截器)
是進(jìn)入控制器之前和之后處理相關(guān)邏輯,可以做日志,事務(wù)處理,異常處理,響應(yīng)數(shù)據(jù)格式等

Exception filter (異常過濾)
是捕獲錯(cuò)誤信息,返回響應(yīng)數(shù)據(jù)給客戶端??梢宰鲎远x行營異常格式

請求過程的執(zhí)行順序

  • 中間件
  • 守衛(wèi)
  • 攔截器(代碼next.handle() 之前)
  • 管道
  • 路由處理
  • 攔截器(代碼next.handle()之后)
  • 異常過濾器

DI 依賴注入

是一種重要的應(yīng)用設(shè)計(jì)模式,在設(shè)計(jì)應(yīng)用的時(shí)候時(shí)常會用到它,提升它們的開發(fā)效率和模塊化程度。

  • 利用@Injectable創(chuàng)建服務(wù)
    我們創(chuàng)建的類提供了一個(gè)服務(wù),@Injectable() 裝飾器把它標(biāo)記為可注入的服務(wù),該注入器負(fù)責(zé)創(chuàng)建服務(wù)實(shí)例

cats.service.ts

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  findAll(): Cat[] {
    return this.cats;
  }
}
  • 注冊服務(wù)
    將服務(wù)添加到@Module()裝飾器的provider數(shù)組中

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 {}
  • 注入服務(wù)
    通過構(gòu)造函數(shù)注入依賴項(xiàng)

cats.controller.ts

import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

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

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}

當(dāng)注入器實(shí)例化 CatsController時(shí),首先查找它所依賴項(xiàng),當(dāng)找到CatsService依賴項(xiàng),將用CatsService令牌執(zhí)行查找,并根據(jù)第二部返回 CatsService類。默認(rèn)為單例,Nest將創(chuàng)建CatsService實(shí)例。將其緩存并返回,如果已經(jīng)存在緩存,則返回現(xiàn)有的實(shí)例。

DI 提供者 provider

provider會使用DI令牌來配置注入器

標(biāo)準(zhǔn)提供者

標(biāo)準(zhǔn)提供者, 語法實(shí)際是一種簡寫:

provider: [Logger]

會被拓展為以下配置:

[{
  provide: Logger,
  useClass: Logger
}]

該配置是具有兩個(gè)屬性的對象字面量

provide: 令牌,它作為一個(gè)key,在定位依賴值和配置注入器使用。
useClass/ useExisting/useValue: 提供者對象,它告訴注入器要如何創(chuàng)建依賴值,每一種代表不用類型的依賴,下面會進(jìn)行討論

1 useValue 值提供者

值類型依賴,用于常量,函數(shù),對象注入,有時(shí)候提供一個(gè)現(xiàn)成的對象會比注入器從類去創(chuàng)建更簡單一些。如果注入一個(gè)已經(jīng)創(chuàng)建過的對象,請使用useValue選項(xiàng)來配置該注入器。

2 useClass 類提供者

類依賴,動(dòng)態(tài)確定令牌將解析為的類

3 useFactory 工廠提供者

工廠類型依賴,有時(shí)候需要?jiǎng)討B(tài)創(chuàng)建依賴值,創(chuàng)建時(shí)需要的信息要等到運(yùn)行期間才能拿到,當(dāng)需要從第三方庫創(chuàng)建依賴項(xiàng)實(shí)例時(shí),工廠提供者也很有用,因?yàn)榈谌綆觳皇菫镈I而設(shè)計(jì)的。

4 useExisting 別名提供者

為現(xiàn)有的提供程序創(chuàng)建別名

provider有以下三個(gè)作用域

SINGLETON(defualt): 默認(rèn)值,在程序啟動(dòng)時(shí),將被實(shí)例化,單例將在整個(gè)應(yīng)用程序中共享,實(shí)例可以被緩存,并且實(shí)例化僅發(fā)生一次

REQUEST: 每一個(gè)新的請求,都會創(chuàng)建一個(gè)新的實(shí)例,這個(gè)實(shí)例在請求結(jié)束后,將會被垃圾回收

TRANSIENT: 不跨消費(fèi)者共享,注入該provider,都將有一個(gè)專用的實(shí)例

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容