這篇文章你會學習到:
- 什么是 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 就可以在整個程序中使用了。
〖堅持的一俢〗