456 - 《依赖注入》
发布于 2024年7月9日
新手笔记,欢迎指正。之前没接触过这种模式,由于要参与维护一个内部框架,他用了 inversify + reflect-metadata 做依赖注入来组织代码,所以就学习下。
1、说下概念。
在聊依赖注入(Dependency Injection,简称 DI)之前,需要先聊下 IoC。IoC 全程 Inversion of Control(控制反转),是一种设计原则,用于实现松耦合的系统,通过将对象的创建和依赖关系的管理交给外部容器或框架,让代码更加模块化和可测试。
IoC 有多种实现方法,比如 DI、事件驱动和模版方法等,其中 DI 应该是最常见的方式。DI 有 3 个核心概念,1)Dependency,2)Injection,将 Dependency 传给类,3)Container,用于管理依赖性的生命周期。
借助 TypeScript,通常可以用 reflect-metadata + inversify 实现依赖注入。
熟悉 Angular 的同学应该对此会比较熟悉,我没用过,所以对 DI 没啥概念。
2、快速上手。
$ pnpm i inversify reflect-metadata typescript father -D
编辑 tsconfig.json。
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": [
"esnext",
"dom"
]
}
}
编辑 src/index.ts 。
import 'reflect-metadata';
import { Container, injectable, inject } from "inversify";
let TYPES = {
Foo: Symbol.for("Foo"),
Bar: Symbol.for("Bar"),
};
@injectable()
class Foo {
doSomething() {
console.log(`Foo is do