NestJS 依賴注入方式全解

一、基礎注入方式

1. 構造函數注入(Constructor Injection)

適用場景:模塊間依賴傳遞,服務初始化時必須存在的依賴
實現方式:通過構造函數參數聲明依賴,NestJS 自動解析并注入

@Injectable()
class UserService {constructor(private readonly logger: LoggerService) {} // 自動注入 LoggerServicegetUser() {this.logger.log('Fetching user data');// 業務邏輯}
}

2. 屬性注入(Property Injection)

適用場景:可選依賴或動態注入場景
實現方式:使用 @Inject() 裝飾器配合自定義 Token

@Injectable()
class OrderService {@Inject('PAYMENT_GATEWAY') // 自定義 Tokenprivate paymentGateway: PaymentService;processPayment() {this.paymentGateway.charge(); // 動態注入的支付網關}
}

二、高級注入模式

3. 值提供者(Value Provider)

適用場景:注入配置常量、第三方庫實例
實現方式:通過 useValue 定義固定值

@Module({providers: [{provide: 'API_KEY',useValue: '12345-ABCDE', // 硬編碼 API Key},{provide: 'EXTERNAL_SDK',useValue: new ThirdPartySDK(), // 注入第三方實例}]
})
class ConfigModule {}

4. 類提供者(Class Provider)

適用場景:根據環境動態切換實現類
實現方式:使用 useClass 指定具體類

@Module({providers: [{provide: 'ConfigService',useClass: process.env.NODE_ENV === 'prod' ? ProdConfigService : DevConfigService,}]
})
class AppModule {}

5. 工廠提供者(Factory Provider)

適用場景:需要運行時計算或組合依賴的場景
實現方式:通過 useFactory 動態創建實例

@Module({providers: [{provide: 'DatabaseConnection',useFactory: async (configService: ConfigService) => {const config = await configService.getDatabaseConfig();return createConnection(config);},inject: [ConfigService], // 注入其他依賴}]
})
class DatabaseModule {}

6. 異步提供者(Async Provider)

適用場景:處理異步初始化操作(如數據庫連接)
實現方式:結合 useFactoryasync/await

@Module({providers: [{provide: 'RedisClient',useFactory: async () => {const client = createClient({ url: 'redis://localhost:6379' });await client.connect();return client;},}]
})
class CacheModule {}

7. 多提供者(Multi Provider)

適用場景:插件系統、中間件集合等需要多個同類實現的場景
實現方式:設置 multi: true 標記

@Module({providers: [{provide: 'EventListeners',useClass: OrderListener,multi: true,},{provide: 'EventListeners',useClass: PaymentListener,multi: true,}]
})
class EventModule {}

三、最佳實踐與常見問題

1. 模塊化設計原則

  • 單一職責模塊:每個模塊聚焦特定功能領域(如 UserModuleAuthModule
  • 跨模塊依賴:通過 exports 暴露服務,避免循環導入
    @Module({providers: [UserService],exports: [UserService], // 其他模塊可注入 UserService
    })
    class UserModule {}
    

2. 測試優化策略

  • 模擬依賴:使用 @nestjs/testing 創建隔離測試環境
    const module = await Test.createTestingModule({providers: [UserService,{ provide: LoggerService, useValue: mockLogger },],
    }).compile();
    

3. 性能優化技巧

  • 延遲加載:對非關鍵依賴使用 @LazyInject()(需第三方庫支持)
  • 作用域控制:通過 @Injectable({ scope: Scope.TRANSIENT }) 管理實例生命周期

4. 常見問題解析

  • 循環依賴:使用 forwardRef() 打破循環
    @Module({imports: [forwardRef(() => OrderModule)],
    })
    class UserModule {}
    
  • Token 沖突:優先使用類名作為 Token,避免字符串 Token 重復

四、實戰案例:TypeORM 集成

@Module({imports: [TypeOrmModule.forRootAsync({useFactory: (config: ConfigService) => ({type: 'postgres',url: config.get('DATABASE_URL'),entities: [__dirname + '/**/*.entity{.ts,.js}'],}),inject: [ConfigService],}),TypeOrmModule.forFeature([UserEntity]),],providers: [UserService],
})
class UserModule {}@Injectable()
class UserService {constructor(@InjectRepository(UserEntity)private userRepo: Repository<UserEntity>,) {}async findUser(id: string) {return this.userRepo.findOne(id);}
}

五、總結

NestJS 的依賴注入系統通過多樣化的注入方式和靈活的提供者配置,為開發者提供了強大的架構設計能力。從基礎的構造函數注入到復雜的工廠提供者,每種模式都針對特定場景進行了優化。掌握這些模式后,開發者可以:

  1. 實現模塊間低耦合設計
  2. 提升代碼可測試性與可維護性
  3. 動態適配不同運行環境
  4. 構建可擴展的插件化架構

建議在實際項目中結合具體場景選擇注入方式,并利用 NestJS 的模塊化特性構建清晰的應用架構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919403.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919403.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919403.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

完整源碼+技術文檔!基于Hadoop+Spark的鮑魚生理特征大數據分析系統免費分享

&#x1f393; 作者&#xff1a;計算機畢設小月哥 | 軟件開發專家 &#x1f5a5;? 簡介&#xff1a;8年計算機軟件程序開發經驗。精通Java、Python、微信小程序、安卓、大數據、PHP、.NET|C#、Golang等技術棧。 &#x1f6e0;? 專業服務 &#x1f6e0;? 需求定制化開發源碼提…

云原生俱樂部-shell知識點歸納(1)

shell的內容也挺多的&#xff0c;雖然云原生課程主要是講grep、sed、awk三劍客&#xff0c;但是還有結合循環結構&#xff0c;判斷語句&#xff0c;以及函數等內容。還是有點復雜的&#xff0c;并且我對shell的掌握并不多&#xff0c;所以寫的可能并不全。當然&#xff0c;如果…

設計模式(四)——責任鏈模式

1. 責任鏈模式的定義 責任鏈模式&#xff08;Chain of Responsibility&#xff0c;簡稱 CoR&#xff0c;也叫職責鏈模式&#xff09;是一種行為型設計模式&#xff0c;允許一個請求在一系列處理器&#xff08;handlers&#xff09;中傳遞。每個處理器可以選擇自己處理該請求&am…

MyBatis-Plus基礎篇詳解

文章目錄前言一、簡單介紹MyBatis-Plus1.1 特性1.2 架構二、SpringBoot集成MyBatis-Plus2.1 項目搭建2.2 導入所需依賴2.3 配置application.yml2.4 創建實體類2.5 創建Mapper接口2.6 啟動類配置三、DQL操作3.1 基礎查詢3.2 QueryWrapper查詢3.3 LambdaQueryWrapper查詢3.4 分頁…

基于W55MH32Q-EVB 實現 HTTP 服務器配置 OLED 滾動顯示信息

目錄 1 前言 2 項目環境 2.1 硬件準備 2.2 軟件環境 3.硬件連接和方案 3.1 硬件連接 3.2 方案圖示 4.例程修改 1 前言 HTTP&#xff08;超文本傳輸協議&#xff0c;HyperText Transfer Protocol&#xff09;是一種用于分布式、協作式、超媒體信息系統的應用層協議&#xff0c; …

YggJS RLogin暗黑霓虹主題登錄注冊頁面 版本:v0.1.1

項目介紹 yggjs_rlogin 是一個專注于 React 登錄/注冊頁面的組件庫。本文檔介紹“暗黑霓虹”主題&#xff1a;#111 暗色背景 青藍霓虹描邊輸入框 賽博朋克光效按鈕。 安裝說明 安裝&#xff1a;pnpm add yggjs_rlogin react react-dom使用&#xff1a;從 yggjs_rlogin 引入組…

大數據畢業設計選題推薦:護膚品店鋪運營數據可視化分析系統詳解

&#x1f34a;作者&#xff1a;計算機畢設匠心工作室 &#x1f34a;簡介&#xff1a;畢業后就一直專業從事計算機軟件程序開發&#xff0c;至今也有8年工作經驗。擅長Java、Python、微信小程序、安卓、大數據、PHP、.NET|C#、Golang等。 擅長&#xff1a;按照需求定制化開發項目…

【github-action 如何為github action設置secrets/environment】

Using secrets in GitHub Actions 在 GitHub Actions 中使用密鑰 Learn how to create secrets at the repository, environment, and organization levels for GitHub Actions workflows. 學習如何在倉庫、環境和組織級別為 GitHub Actions 工作流創建密鑰。 Creating secre…

寶塔面板Docker安裝n8n漢化中文

一、Docker安裝N8N 安裝配置默認即可&#xff0c;如果端口已被使用&#xff0c;可以自行更改 當狀態為運行中時&#xff0c;就可以點擊端口&#xff1a;訪問N8N 填寫完信息后&#xff0c;點擊下一步&#xff08;郵箱要能接收郵件&#xff1a;接收密鑰&#xff09; 點開始 點擊發…

F003疫情傳染病數據可視化vue+flask+mysql

編號:F003 文章結尾有CSDN官方提供的學長的聯系方式&#xff01;&#xff01; 歡迎關注B站 ? vue flask 前后端分離架構 ? 實現中國地圖、柱狀圖、折線圖、水地圖、環圖等多種圖形的echarts可視化分析 視頻 vueflask爬蟲 新冠疫情大屏實現 python 可視化分析項目源碼1 系統…

plantsimulation知識點25.8.19 工件不在RGV中心怎么辦?

如果出現這種情況&#xff0c;工件不在RGV的中心該怎么處理。首先說一下出現這種情況的原因。因為模擬的是兩臺RGV共同托舉一個工件移動&#xff0c;實際上RGV控制的代碼還是寫在一條軌道的傳感器控制代碼中。另一臺RGV只是從動的&#xff0c;工件也是在其中任意一臺RGV上&…

redis-sentinel基礎概念及部署

一. 引言&#xff1a;Redis Sentinel 是 redis 官方提供的高可用解決方案&#xff0c;主要用于監控 Redis 主從集群&#xff0c;在主節點故障時自動完成故障轉移&#xff0c;確保服務持續可用。二. 核心功能1. 監控&#xff08;monitoring&#xff09;&#xff1a;持續檢查主節…

LangChain RAG 簡述

在 LangChain 中實現 RAG&#xff08;檢索增強生成&#xff0c;Retrieval-Augmented Generation&#xff09;的核心思路是&#xff1a;讓大模型在生成回答前&#xff0c;先從外部知識庫&#xff08;如文檔、數據庫等&#xff09;中檢索相關信息&#xff0c;再基于檢索到的內容生…

GEO 優化專家孟慶濤:技術破壁者重構 AI 時代搜索邏輯

在生成式 AI 重塑全球搜索生態的浪潮中&#xff0c;中國 GEO&#xff08;生成式引擎優化&#xff09;領域的開拓者孟慶濤以 "智能決策革命" 的技術框架&#xff0c;顛覆了傳統 "發發文章" 的簡單認知。作為遼寧粵穗網絡科技有限公司總經理兼 GEO 實驗室主任…

用relation-graph構建關系圖譜 vue版

用relation-graph構建關系圖譜 vue版vue文件和Json數據vue文件和Json數據 <template><div><div style"margin-top:0px;width: calc(100% - 10px);height:calc(100vh);"><RelationGraph ref"graphRef" :options"graphOptions&qu…

Python基礎-控制結構

控制結構是編程語言中用來控制程序執行流程的語句。Python提供了條件語句、循環語句等控制結構&#xff0c;讓程序能夠根據不同條件執行不同的代碼塊。 程序執行流程圖&#xff1a; ┌───────────────────────────────────────────…

Java算法之排序

下面我們將講述七大基于比較的排序算法的基本原理及實現。并從穩定性、時間復雜度、空間復雜度3種性能對每種排序進行分析。 重點&#xff1a;快速排序和堆排序&#xff1b;難點&#xff1a;快速排序和歸并排序 目錄 一、排序概念 二、常見排序算法的實現 2.1 插入排序 2.…

RabbitMQ:SpringAMQP 多消費者綁定同一隊列

目錄一、案例需求二、代碼實現三、總結生產者源碼 消費者源碼 一、案例需求 模擬WorkQueue&#xff0c;實現一個隊列綁定多個消費者。 在RabbitMQ的控制臺創建一個隊列&#xff0c;命名為work.queue。在生產者服務中定義測試方法&#xff0c;在1s內產生50條消息&#xff0c;…

Java技術總監的成長之路(技術干貨分享)

以下是針對 ?Java技術總監? 在 Linux 環境下搭建企業級開發環境的完整指南&#xff0c;涵蓋 JDK 配置、工程工具鏈、協作平臺及性能優化方案&#xff1a; 本文章僅提供學習&#xff0c;切勿將其用于不法手段&#xff01; 一、核心環境搭建 1. ?JDK 安裝與調優? ?版本選擇…

C++代碼解釋:實現一個 mystring 類,用于表示字符串,實現構造函數,默認構造長度為 10 的空間,提供打印字符串,獲取空間大小,修改內容的成員函數

題目代碼#include <cstring> // 包含字符串處理函數庫&#xff0c;如strlen、strncpy等 #include <iostream> // 包含輸入輸出流庫&#xff0c;用于cout等操作 using namespace std; // 使用標準命名空間&#xff0c;避免重復書寫std::class mystring { // 定…