【Nest 極速指南】進階篇之 Provider

這篇文章你會學習到:

  • 什么是 Provider
  • 創(chuàng)建一個服務
  • 依賴注入
  • 定制 Provider
  • 可選 Provider
  • 基于屬性的注入
  • 注冊 Provider

什么是 Provider

幾乎所有的組件模塊都可以認為是 Provider:service, repository, factory, helper 等等。他們都可以通過構造函數 constructor 注入依賴關系,事實上 Provider 只不過是 @Injectable() 裝飾器注解的類。

創(chuàng)建一個服務

我們從創(chuàng)建一個簡單的 ProductsService 開始,該服務將負責處理相關數據:

// products.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class ProductsService {
    private readonly products: any[] = [];

    create(product: any) {
        this.products.push(product);
    }

    findAll(): any[] {
        return this.products;
    }
}

現(xiàn)在我們通過一個 Controller 類,將這個服務的相關功能提供出去:

// products.controller.ts

import { Controller, Get, Post, Body } from '@nestjs/common';
import { ProductsService } from './products.service';

@Controller('products')
export class ProductsController {
    constructor(private readonly productsService: ProductsService) {}

    @Post()
    async create(@Body() product: any) {
        this.productsService.create(product);
    }

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

ProductsService 通過類構造函數注入到整 ProductsController 中去,在 ProductsController 內部可以使用 ProductsService 實例 productsService。

依賴注入

Nest 是建立在依賴注入之上的,通過 TypetScript 管理依賴關系非常簡單,因為它們只會按照類型解析,例如:

constructor(private readonly productsService: ProductsService) {}

依賴,是當類需要執(zhí)行其功能時,所需要的服務或對象。 依賴注入是一種編碼模式,其中的類會從外部源中請求獲取依賴,而不是自己創(chuàng)建它們。我們建議大家閱讀一下 Angular 中的依賴注入 這篇文章,來理解這個概念。

定制 Provider

這部分請參看:https://docs.nestjs.cn/6/fundamentals

基于屬性的注入

在一些非常特殊的情況下,基于屬性的注入可能會有用。例如,如果頂級類依賴于一個或多個提供者,那么通過從構造函數中調用子類中的 super() 來傳遞它們就會非常煩人了。因此,為了避免出現(xiàn)這種情況,可以在屬性上使用 @inject() 裝飾器:

import { Injectable, Inject } from '@nestjs/common';

@Injectable()
export class HttpService<T> {
    @Inject('HTTP_OPTIONS')
    private readonly httpClient: T;
}

注冊 Provider

我們如果定義好一個 Provider (ProductsService),并且有了 Provider 的使用者(ProductsController)后,我們需要使用 Nest 注冊該服務,以便它可以執(zhí)行注入。我們通過 app.module.ts 將服務注冊到整個應用中去:

import { Module } from '@nestjs/common';
import { ProductsController } from './products.controller';
import { ProductsService } from './products.service';

@Module({
    imports: [],
    controllers: [ProductsController],
    providers: [ProductsService],
})
export class AppModule {}

這樣一來,Provider 就可以在整個程序中使用了。

〖堅持的一俢〗

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

相關閱讀更多精彩內容

  • 2.1 我們的理念是:讓別人為你服務 IoC是隨著近年來輕量級容器(Lightweight Container)的...
    好好學習Sun閱讀 2,862評論 0 11
  • 文章作者:Tyan博客:noahsnail.com 3.4 依賴 標準企業(yè)應用不會由一個對象(或Spring用語中...
    SnailTyan閱讀 1,258評論 0 1
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,619評論 1 32
  • 最近想系統(tǒng)的學習一下Spring的相關知識,在這里分享一下。也希望能幫助那些對英文技術文檔閱讀比較困難的朋友。接下...
    Aiibai閱讀 1,652評論 5 16
  • 《7》三七一醫(yī)院事事讓人難忘 在三七一的那些天,總算能安靜幾天,無論是她家的事,還是醫(yī)院里的事,也算是到了平靜期。...
    解綁閱讀 502評論 3 10

友情鏈接更多精彩內容