NestJS 的灵魂是 Dependency Injection,依赖注入。
你在 Controller 里写:
constructor(private readonly flightsService: FlightsService) {}不是说:
“我自己 new 了一个
FlightsService”
而是说:
“我声明我需要这个调度员,Nest 调度系统会把它派给我”
这件事看起来像小语法,实际上是架构核心。
#1. 为什么不能满地 new?
如果你手动 new:
- 生命周期难统一
- 测试难替换
- 配置难注入
- 依赖关系难追踪
- mock 很痛苦
而 DI 的结果是:
你声明需要什么
Nest 负责怎么组装#2. Provider token 心智
更抽象一点看,Nest 注入的是“令牌对应的实现”。
比如自定义 provider:
{
provide: 'PAYMENT_CLIENT',
useValue: paymentClient,
}然后这样注入:
import { Inject, Injectable } from '@nestjs/common';
@Injectable()
export class BillingService {
constructor(
@Inject('PAYMENT_CLIENT')
private readonly paymentClient: { charge: (amount: number) => Promise<void> },
) {}
}#3. 一张图讲明白
Controller 说:我需要 FlightsService
↓
Module 里注册了 FlightsService
↓
Nest Injector 找到对应 provider
↓
实例化并注入这就是机场内部总调度网。