TypeScript 面试题
目录

请解释如何使用装饰器实现依赖注入 (Dependency Injection)?

· 约 4 分钟读完 · 第 200 / 256 章

推荐答案

在 TypeScript 中,装饰器可以用于实现依赖注入(Dependency Injection, DI)。通过装饰器,我们可以将依赖项注入到类中,而不需要手动实例化这些依赖项。以下是一个简单的实现示例:

本题详细解读

1. 依赖注入容器的实现

首先,我们定义了一个 DIContainer 类,它用于存储和解析依赖项。DIContainer 有两个主要方法:

  • register(key: string, service: any):用于将服务注册到容器中,key 是服务的唯一标识符,service 是服务的实例。
  • resolve<T>(key: string): T:用于从容器中解析服务,key 是服务的唯一标识符,返回对应的服务实例。

2. 装饰器的实现

接下来,我们定义了一个 Inject 装饰器。这个装饰器的作用是将依赖项注入到类的属性中。装饰器接收一个 key 参数,表示要注入的服务的唯一标识符。

在装饰器的实现中,我们使用了 Object.defineProperty 来定义属性的 getter,当访问该属性时,会从 DIContainer 中解析对应的服务实例。

3. 服务注册与使用

我们定义了一个 MyService 类,并将其注册到 DIContainer 中。然后,我们在 MyClass 类中使用 @Inject('myService') 装饰器将 MyService 注入到 myService 属性中。

最后,我们创建 MyClass 的实例并调用 execute 方法,execute 方法中调用了 myService.doSomething(),从而实现了依赖注入。

4. 总结

通过装饰器实现依赖注入,我们可以将依赖项的创建和管理与业务逻辑分离,使得代码更加模块化和可维护。装饰器提供了一种简洁的方式来声明依赖关系,而依赖注入容器则负责管理这些依赖项的生命周期和解析。