最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NestJS開發(fā)核心概念Providers類基本用法詳解

 更新時間:2023年08月08日 09:55:46   作者:南玖  
這篇文章主要為大家介紹了NestJS開發(fā)核心概念Providers類基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

ProvidersNest中的一個基本概念,許多Nest中定義的類都可以被視為一個Provider,比如:service、repository、factory、helper等,它們都可以通過constructor注入依賴關(guān)系,這就意味著類與類之間可以創(chuàng)建各種依賴關(guān)系,并且維護各個類之間依賴關(guān)系的工作將委托給Nest運行時系統(tǒng)。

Provider類(service)基本用法

前面幾章我們通過nest-cli生成的代碼中就包含有service

比如:

// nanjiu.service.ts
import { Injectable } from '@nestjs/common';
import { CreateNanjiuDto } from './dto/create-nanjiu.dto';
import { UpdateNanjiuDto } from './dto/update-nanjiu.dto';
@Injectable()
export class NanjiuService {
  create(createNanjiuDto: CreateNanjiuDto) {
    return 'This action is nanjiu post';
  }
  findAll() {
    return `This action returns all nanjiu`;
  }
  findOne(id: number) {
    return `This action returns a #${id} nanjiu`;
  }
  update(id: number, updateNanjiuDto: UpdateNanjiuDto) {
    return `This action updates a #${id} nanjiu`;
  }
  remove(id: number) {
    return `This action removes a #${id} nanjiu`;
  }
}

使用步驟如下:

@Injectable()裝飾器

這里的NanjiuService類通過@Injectable裝飾器標記為一個provider,表明該類可以被NestIOC容器管理

在module中注冊

服務(wù)需要在對應(yīng)的module中進行注冊,如果不注冊IOC容器是不會幫你創(chuàng)建對象的,而且還會報錯

// nanjiu.module.ts
@Module({
  controllers: [NanjiuController],
  providers: [NanjiuService]
})
export class NanjiuModule {}

在controller中注入并使用

module中注冊service類后,再通過controller的構(gòu)造函數(shù)進行注入,那么該類就可以在controller中去使用了

// nanjiu.controller.ts
@Controller('nanjiu')
export class NanjiuController {
  constructor(private readonly nanjiuService: NanjiuService) {}
  @Post()
  @Header('Cache-Control', 'none')
  create(@Body() createNanjiuDto: CreateNanjiuDto) {
    console.log('body', createNanjiuDto)
    return this.nanjiuService.create(createNanjiuDto);
  }
}

可以看到是通過類構(gòu)造函數(shù) constructor(private readonly nanjiuService: NanjiuService) {}這種方式來進行依賴注入的,Nest提供了IOC容器利用Typescript自帶類型的特點自動創(chuàng)建對象的能力,注意這里是單例模式,如果該Service在其它地方也被用過,那么會在不會重新創(chuàng)建對象,各個應(yīng)用只會有一個該Service的對象,容器會先尋找當前有沒有,如果沒有再進行創(chuàng)建。

自定義Provider

Provider可以是一個值(value),也可以是一個類(class),還可以是一個工廠函數(shù)(factory)

useClass

上面providers的那種寫法其實是一種簡寫,它的完整寫法應(yīng)該是這樣:

// nanjiu.module.ts
@Module({
  controllers: [NanjiuController], // 控制器
  providers: [{
    provide: 'NANJIU',  // 自定義依賴注入的標識
    useClass: NanjiuService // 依賴注入的類
  }]
})
export class NanjiuModule {}

完整寫法可以通過provide屬性給不同的provider標注不同的token

然后再controller中需要使用@Inject(對應(yīng)的token)進行注入

// nanjiu.controller.ts
@Controller('nanjiu')
export class NanjiuController {
  constructor(@Inject('NANJIU') private readonly nanjiuService: NanjiuService) {}

  @Post()
  @Header('Cache-Control', 'none')
  create(@Body() createNanjiuDto: CreateNanjiuDto) {
    console.log('body', createNanjiuDto, this.nanjiuService)
    return true
    return this.nanjiuService.create(createNanjiuDto);
  }
}

useValue

還可以使用useValue自定義注入值

// nanjiu.module.ts
@Module({ // 模塊裝飾器
  controllers: [NanjiuController], // 控制器
  providers: [{
    provide: 'NANJIU',  // 自定義依賴注入的標識
    useValue: {
      name: 'nanjiu' // 依賴注入的值
    }
  }]
})

useFactory

工廠函數(shù)可以提供動態(tài)的provider,由factory函數(shù)的返回值來確定,factory函數(shù)可以很簡單也可以很復(fù)雜,它也可以使用其它provider,不過需要在inject屬性進行注入,注入的provider可以是可選的

  • 工廠函數(shù)可以接受(可選)參數(shù)。
  • (可選)inject屬性接受一組提供程序,Nest 將在實例化過程中解析這些提供程序并將其作為參數(shù)傳遞給工廠函數(shù)。這兩個列表應(yīng)該是相關(guān)的:Nest 將以inject相同的順序?qū)⒘斜碇械膶嵗鳛閰?shù)傳遞給工廠函數(shù)。
// nanjiu.module.ts
import { Module } from '@nestjs/common';
import { NanjiuService } from './nanjiu.service';
import { UserService } from 'src/user/user.service';
import { NanjiuController } from './nanjiu.controller';
@Module({ // 模塊裝飾器
  controllers: [NanjiuController], // 控制器
  providers: [{
    provide: 'NANJIU',  // 自定義依賴注入的標識
    useClass: NanjiuService // 依賴注入的類
  },
  UserService,
  {
    provide: 'USER', // 自定義依賴注入的標識
    useFactory: (...args) => { // 工廠模式
      console.log('useFactory', args)
      return new UserService() // 依賴注入的類
    },
    inject: [UserService] // 依賴注入的類
  }
]
})
export class NanjiuModule {}

可選的Provider

有時你可能存在不一定需要解決的依賴關(guān)系。例如,你的類可能依賴于配置對象,但如果沒有傳遞任何內(nèi)容,則應(yīng)使用默認值。在這種情況下,依賴關(guān)系變得可選,這時候可以給對應(yīng)的注入服務(wù)再增加一個@Optional()裝飾器就行

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

異步Provider

useFactory可以返回一個promise 或者其他異步操作,Nest 將在實例化任何依賴(注入)此類提供程序的類之前等待promise的結(jié)果。

// nanjiu.module.ts
@Module({ // 模塊裝飾器
  controllers: [NanjiuController], // 控制器
  providers: [
  UserService,
  {
    provide: 'USER', // 自定義依賴注入的標識
    useFactory: async () => { // 工廠模式
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve(new UserService())
        }, 1000)
      })
    },
    inject: [UserService] // 依賴注入的類
  }
]
})
export class NanjiuModule {}

以上就是NestJS開發(fā)核心概念Providers類基本用法詳解的詳細內(nèi)容,更多關(guān)于NestJS核心Providers類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Node.js 路由的實現(xiàn)方法

    Node.js 路由的實現(xiàn)方法

    這篇文章主要介紹了Node.js 路由的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • node中使用log4js4.x版本記錄日志的方法

    node中使用log4js4.x版本記錄日志的方法

    這篇文章主要介紹了node中使用log4js4.x版本記錄日志的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 在Debian(Raspberry Pi)樹莓派上安裝NodeJS的教程詳解

    在Debian(Raspberry Pi)樹莓派上安裝NodeJS的教程詳解

    在樹莓派上運行NodeJS并不需要特別的配置,你只需要確??梢杂胦penssh遠程連接到你的樹莓派就ok了,關(guān)于在Debian(Raspberry Pi)樹莓派上安裝NodeJS的方法,大家可以通過本文了解下
    2017-09-09
  • nodejs前端模板引擎swig入門詳解

    nodejs前端模板引擎swig入門詳解

    這篇文章主要介紹了nodejs前端模板引擎swig入門詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Node.js漢字轉(zhuǎn)拼音pinyin-pro的具體使用

    Node.js漢字轉(zhuǎn)拼音pinyin-pro的具體使用

    pinyin-pro是一個功能強大的漢字拼音轉(zhuǎn)換工具庫,本文就來詳細的介紹一下Node.js漢字轉(zhuǎn)拼音pinyin-pro的具體使用,感興趣的可以了解一下
    2025-09-09
  • Node4-5靜態(tài)資源服務(wù)器實戰(zhàn)以及優(yōu)化壓縮文件實例內(nèi)容

    Node4-5靜態(tài)資源服務(wù)器實戰(zhàn)以及優(yōu)化壓縮文件實例內(nèi)容

    這篇文章主要介紹了Node4-5靜態(tài)資源服務(wù)器實戰(zhàn)以及優(yōu)化壓縮文件實例內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2019-08-08
  • node?puppeteer爬蟲爬取電影網(wǎng)站及生成pdf文檔示例

    node?puppeteer爬蟲爬取電影網(wǎng)站及生成pdf文檔示例

    這篇文章主要介紹了node?puppeteer爬蟲爬取電影網(wǎng)站及生成pdf文檔使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • NodeJs更改安裝目錄后下載pnpm仍然在老目錄的問題解決辦法

    NodeJs更改安裝目錄后下載pnpm仍然在老目錄的問題解決辦法

    pnpm是一款高效的JavaScript包管理工具,相比npm和yarn,在性能、功能上有顯著優(yōu)化,這篇文章主要介紹了NodeJs更改安裝目錄后下載pnpm仍然在老目錄問題的解決辦法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-11-11
  • socket.io與pm2(cluster)集群搭配的解決方案

    socket.io與pm2(cluster)集群搭配的解決方案

    這篇文章主要給大家介紹了關(guān)于socket.io與pm2(cluster)集群搭配的解決方案,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來看看吧。
    2017-06-06
  • 深入理解NodeJS 多進程和集群

    深入理解NodeJS 多進程和集群

    這篇文章主要介紹了深入理解NodeJS 多進程和集群,詳細的介紹了什么是進程和進程的實現(xiàn)等,非常具有實用價值,需要的朋友可以參考下
    2018-10-10

最新評論

靖西县| 晋宁县| 获嘉县| 五指山市| 夏津县| 黄浦区| 阜新| 海城市| 清水县| 治多县| 信阳市| 蓬溪县| 手机| 大余县| 阳西县| 锦州市| 民县| 邻水| 四川省| 阿瓦提县| 依安县| 新民市| 泊头市| 大埔区| 博白县| 凤城市| 广元市| 邵武市| 新河县| 阜平县| 易门县| 呼伦贝尔市| 安顺市| 丹东市| 龙川县| 和平区| 九江市| 太白县| 太仆寺旗| 拜城县| 太湖县|