TypeScript Academy · 课时

使用 InversifyJS 的 DI 容器

使用容器注册并解析服务。

第 3 / 4 课13 个步骤

使用 InversifyJS 的 DI 容器 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

为何需要 DI container

手动连接大型对象图既繁琐又容易出错。DI container 会注册每个依赖项的构建方式,并自动解析它们。InversifyJS 是一种常用的 TypeScript container。

安装与启用

InversifyJS 依赖装饰器和反射元数据。您需要从 inversify 导入,并启用 experimentalDecorators 和 reflect-metadata。

import "reflect-metadata";
import { Container, injectable, inject } from "inversify";

使用 @injectable 标记类

@injectable() 装饰器会告诉 container 某个类可以被构造和注入。container 构建的每个类都需要该装饰器。

import { injectable } from "inversify";

@injectable()
class ConsoleLogger {
  log(m: string) { console.log(m); }
}

使用 @inject 声明依赖项

在构造函数参数上使用 @inject(token),告诉 container 应提供哪个绑定。该标记用于标识依赖项。

@injectable()
class OrderService {
  constructor(@inject("Logger") private logger: ConsoleLogger) {}
  place() { this.logger.log("placed"); }
}

创建 container

Container 保存应用的所有绑定。您可以在启动时创建一个 container,并在其中注册依赖项。

import { Container } from "inversify";
const container = new Container();

将接口绑定到实现

流式 API bind<T>(token).to(Impl) 会将一个标记(通常是接口)映射到 container 将要实例化的具体类。

interface Logger { log(m: string): void; }
container.bind<Logger>("Logger").to(ConsoleLogger);

解析服务

container.get<T>(token) 会构建请求的服务,并为您递归构造和注入其依赖项。

container.bind<OrderService>(OrderService).toSelf();
const svc = container.get<OrderService>(OrderService);
svc.place();

替换实现

如果要使用其他日志记录器,只需将该标记重新绑定到另一个类。使用者依赖的是标记,而不是具体类,因此无需修改使用者。

@injectable()
class SilentLogger implements Logger { log() {} }
container.rebind<Logger>("Logger").to(SilentLogger);

单例作用域

默认情况下,每次调用 get 都可能构建新实例。使用 inSingletonScope() 可以让整个 app 共享同一个实例。

container.bind<Logger>("Logger").to(ConsoleLogger).inSingletonScope();

使用 container 进行测试

在测试中,您可以构建一个全新的 container 并绑定测试替身,在隔离被测试单元的同时获得相同的连接优势。

const testContainer = new Container();
testContainer.bind<Logger>("Logger").to(SilentLogger);

container 的权衡

对于大型对象图,container 可以减少样板代码,但也会增加依赖项、装饰器和间接层。对于小型应用,手动进行构造函数注入通常更加清晰。

快速检查

快速检查本课内容。

回顾

InversifyJS 使用 @injectable、@inject(token) 和一个 Container。您可以使用 bind<Interface>(token).to(Impl) 进行绑定,container.get 会自动解析依赖图。它需要 reflect-metadata 和装饰器,用间接性换取样板代码的减少。

免费开始

用 AI 导师学习 TypeScript — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
101
课程
352

常见问题解答

「使用 InversifyJS 的 DI 容器」课时是免费的吗?

是的 — 「使用 InversifyJS 的 DI 容器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「使用 InversifyJS 的 DI 容器」这节课中我会学到什么?

使用容器注册并解析服务。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 InversifyJS 的 DI 容器」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 控制反转基础
  2. 构造函数注入
  3. 使用 InversifyJS 的 DI 容器
  4. 类型安全的服务令牌
← 返回 TypeScript Academy