全书目录

第七篇:NestJS 完全指南 —— 国际机场总调度宇宙

第七章:Dependency Injection —— 调度员不是你手动招的,是系统派的

1 分钟 317 字 第 187 / 962 个阅读单元

NestJS 的灵魂是 Dependency Injection,依赖注入

你在 Controller 里写:

ts
constructor(private readonly flightsService: FlightsService) {}

不是说:

“我自己 new 了一个 FlightsService

而是说:

“我声明我需要这个调度员,Nest 调度系统会把它派给我”

这件事看起来像小语法,实际上是架构核心。

#1. 为什么不能满地 new

如果你手动 new

  • 生命周期难统一
  • 测试难替换
  • 配置难注入
  • 依赖关系难追踪
  • mock 很痛苦

而 DI 的结果是:

text
你声明需要什么
Nest 负责怎么组装
#2. Provider token 心智

更抽象一点看,Nest 注入的是“令牌对应的实现”。

比如自定义 provider:

ts
{
  provide: 'PAYMENT_CLIENT',
  useValue: paymentClient,
}

然后这样注入:

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

@Injectable()
export class BillingService {
  constructor(
    @Inject('PAYMENT_CLIENT')
    private readonly paymentClient: { charge: (amount: number) => Promise<void> },
  ) {}
}
#3. 一张图讲明白
text
Controller 说:我需要 FlightsService
        ↓
Module 里注册了 FlightsService
        ↓
Nest Injector 找到对应 provider
        ↓
实例化并注入

这就是机场内部总调度网。