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

推荐答案

在 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. 总结

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

纠错
反馈