日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

3. Nest Provider

發(fā)布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 3. Nest Provider 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Providers

Providers 是?Nest?的一個基本概念。許多基本的?Nest?類可能被視為 provider -?service,repository,?factory,?helper?等等。 他們都可以通過?constructor?注入依賴關(guān)系。 這意味著對象可以彼此創(chuàng)建各種關(guān)系,并且“連接”對象實(shí)例的功能在很大程度上可以委托給?Nest運(yùn)行時系統(tǒng)。 Provider只是一個用?@Injectable()?裝飾器注釋的類。

在前面的章節(jié)中,我們已經(jīng)創(chuàng)建了一個簡單的控制器?CatsController?。控制器應(yīng)處理?HTTP?請求并將更復(fù)雜的任務(wù)委托給?providers。Providers 是純粹的?JavaScript?類,在其類聲明之前帶有?@Injectable()裝飾器。

由于?Nest?可以以更多的面向?qū)ο蠓绞皆O(shè)計和組織依賴性,因此我們強(qiáng)烈建議遵循?SOLID?原則。

服務(wù)

讓我們從創(chuàng)建一個簡單的?CatsService?開始。該服務(wù)將負(fù)責(zé)數(shù)據(jù)存儲和檢索,由其使用?CatsController,因此它被定義為provider是一個很好的選擇。因此,我們用這個類來裝飾?@Injectable()。

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;} }Copy to clipboardErrorCopied

要使用?CLI?創(chuàng)建服務(wù)類,只需執(zhí)行?$ nest g service cats?命令。

我們的?CatsService?是具有一個屬性和兩個方法的基本類。唯一的新特點(diǎn)是它使用?@Injectable()?裝飾器。該?@Injectable()?附加有元數(shù)據(jù),因此?Nest?知道這個類是一個?Nest?provider。需要注意的是,上面有一個?Cat?接口。看起來像這樣:

export interface Cat {name: string;age: number;breed: string; }Copy to clipboardErrorCopied

現(xiàn)在我們有一個服務(wù)類來檢索?cat?,讓我們在?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 readonly catsService: CatsService) {}@Post()async create(@Body() createCatDto: CreateCatDto) {this.catsService.create(createCatDto);}@Get()async findAll(): Promise<Cat[]> {return this.catsService.findAll();} }Copy to clipboardErrorCopied

CatsService?是通過類構(gòu)造函數(shù)注入的。注意這里使用了私有的只讀語法。這意味著我們已經(jīng)在同一位置創(chuàng)建并初始化了?catsService?成員。

依賴注入

Nest 是建立在強(qiáng)大的設(shè)計模式, 通常稱為依賴注入。我們建議在官方的?Angular文檔中閱讀有關(guān)此概念的精彩文章。

在?Nest?中,借助?TypeScript?功能,管理依賴項非常容易,因?yàn)樗鼈儍H按類型進(jìn)行解析。在下面的示例中,Nest?將?catsService?通過創(chuàng)建并返回一個實(shí)例來解析?CatsService(或者,在單例的正常情況下,如果現(xiàn)有實(shí)例已在其他地方請求,則返回現(xiàn)有實(shí)例)。解析此依賴關(guān)系并將其傳遞給控制器的構(gòu)造函數(shù)(或分配給指定的屬性):

constructor(private readonly catsService: CatsService) {}Copy to clipboardErrorCopied

作用域

Provider通常具有與應(yīng)用程序生命周期同步的生命周期(“作用域”)。在啟動應(yīng)用程序時,必須解析每個依賴項,因此必須實(shí)例化每個提供程序。同樣,當(dāng)應(yīng)用程序關(guān)閉時,每個provider都將被銷毀。但是,有一些方法可以該標(biāo)provider生命周期的請求范圍。您可以在此處詳細(xì)了解這些技術(shù)。

定制providers

Nest?有一個內(nèi)置的控制反轉(zhuǎn)("IoC")容器,可以解決providers之間的關(guān)系。 此功能是上述依賴注入功能的基礎(chǔ),但要比上面描述的要強(qiáng)大得多。@Injectable()?裝飾器只是冰山一角, 并不是定義 providers 的唯一方法。相反,您可以使用普通值、類、異步或同步工廠。看看這里找到更多的例子。

可選的providers

有時,您可能需要解決一些依賴項。例如,您的類可能依賴于一個配置對象,但如果沒有傳遞,則應(yīng)使用默認(rèn)值。在這種情況下,關(guān)聯(lián)變?yōu)榭蛇x的,provider 不會因?yàn)槿鄙倥渲脤?dǎo)致錯誤。

要指示provider是可選的,請在?constructor?的參數(shù)中使用?@optional()?裝飾器。

import { Injectable, Optional, Inject } from '@nestjs/common';@Injectable() export class HttpService<T> {constructor(@Optional() @Inject('HTTP_OPTIONS') private readonly httpClient: T) {} }Copy to clipboardErrorCopied

請注意,在上面的示例中,我們使用自定義 provider,這是我們包含?HTTP_OPTIONS自定義標(biāo)記的原因。前面的示例顯示了基于構(gòu)造函數(shù)的注入,通過構(gòu)造函數(shù)中的類指示依賴關(guān)系。在此處詳細(xì)了解自定義providers及其關(guān)聯(lián)的?token。

基于屬性的注入

我們目前使用的技術(shù)稱為基于構(gòu)造函數(shù)的注入,即通過構(gòu)造函數(shù)方法注入providers。在某些非常特殊的情況下,基于屬性的注入可能會有用。例如,如果頂級類依賴于一個或多個 providers,那么通過從構(gòu)造函數(shù)中調(diào)用子類中的?super()?來傳遞它們就會非常煩人了。因此,為了避免出現(xiàn)這種情況,可以在屬性上使用?@inject()?裝飾器。

import { Injectable, Inject } from '@nestjs/common';@Injectable() export class HttpService<T> {@Inject('HTTP_OPTIONS')private readonly httpClient: T; }Copy to clipboardErrorCopied

如果您的類沒有擴(kuò)展其他provider,你應(yīng)該總是使用基于構(gòu)造函數(shù)的注入。

注冊 provider

現(xiàn)在我們已經(jīng)定義了 provider(CatsService),并且已經(jīng)有了該服務(wù)的使用者(CatsController),我們需要在?Nest?中注冊該服務(wù),以便它可以執(zhí)行注入。 為此,我們可以編輯模塊文件(app.module.ts),然后將服務(wù)添加到@Module()裝飾器的?providers?數(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 {}Copy to clipboardErrorCopied

得益于此,Nest?現(xiàn)在將能夠解決?CatsController?類的依賴關(guān)系。這就是我們目前的目錄結(jié)構(gòu):

src ├── cats │ ├──dto │ │ └──create-cat.dto.ts │ ├── interfaces │ │ └──cat.interface.ts │ ├──cats.service.ts │ └──cats.controller.ts ├──app.module.ts └──main.ts

總結(jié)

以上是生活随笔為你收集整理的3. Nest Provider的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。