Nest.js 中如何使用依赖注入?

推荐答案

在 Nest.js 中,依赖注入(Dependency Injection, DI)是通过 @Injectable() 装饰器和构造函数注入来实现的。以下是一个简单的示例:

-- -------------------- ---- -------
------ - ---------- - ---- -----------------

-------------
------ ----- ----------- -
  ------- -------- ----- -------- - -------- ------------

  ---------- -------- -
    ------ ----------
  -
-

然后,在控制器或其他服务中通过构造函数注入:

-- -------------------- ---- -------
------ - ----------- --- - ---- -----------------
------ - ----------- - ---- -----------------

-------------------
------ ----- -------------- -
  ------------------- -------- ------------ ------------ --

  ------
  ---------- -------- -
    ------ ---------------------------
  -
-

本题详细解读

1. @Injectable() 装饰器

@Injectable() 装饰器用于标记一个类为可注入的。这意味着 Nest.js 的依赖注入系统可以管理这个类的实例,并在需要时将其注入到其他类中。

2. 构造函数注入

在 Nest.js 中,依赖注入通常通过构造函数来实现。当你在构造函数中声明一个参数时,Nest.js 会自动解析并注入相应的依赖。

在这个例子中,CatsService 会被自动注入到 CatsController 中。

3. 模块注册

为了使依赖注入正常工作,你还需要在模块中注册提供者(Provider)。提供者通常是服务类,但也可以是其他类型的类或值。

-- -------------------- ---- -------
------ - ------ - ---- -----------------
------ - -------------- - ---- --------------------
------ - ----------- - ---- -----------------

---------
  ------------ -----------------
  ---------- --------------
--
------ ----- ---------- --

在这个模块中,CatsService 被注册为一个提供者,因此它可以在 CatsController 中被注入。

4. 依赖注入的作用域

Nest.js 中的依赖注入支持不同的作用域(Scope),包括单例(Singleton)、请求作用域(Request-scoped)等。默认情况下,所有提供者都是单例的,这意味着它们在应用程序的整个生命周期中只会被实例化一次。

5. 自定义提供者

除了类提供者外,Nest.js 还支持自定义提供者,例如工厂提供者、值提供者等。这些提供者可以通过 useFactoryuseValue 等选项来定义。

-- -------------------- ---- -------
---------
  ---------- -
    -
      -------- -------------
      ----------- -- -- -
        ------ --- ---------------------
      --
    --
  --
--
------ ----- -------------- --

在这个例子中,CONNECTION 是一个自定义提供者,它通过工厂函数来创建 DatabaseConnection 的实例。

通过以上方式,Nest.js 提供了强大而灵活的依赖注入机制,使得代码更加模块化和可测试。

纠错
反馈