nestjs 如何工作并使用参数运行构造函数

问题描述 投票:0回答:1

我是nestJS的新手,也找不到太多关于它的信息,所以我也不敢深入研究它的源代码(也是打字稿的初学者)。我真的很想知道这些东西是如何工作的,我将在下面提到

第一: 我正在观看教程,其中我们有名为“任务”的服务

export class TasksController {
  constructor(private readonly tasksService: TasksService) { }

  Get()
  index() {
     this.tasksService.all();
  }
}

这里

TasksService
只是用作类型,我猜不是用作类。在正常的打字稿中,我会写类似的东西

let task = new TasksController(new TasksService())

然后我就可以打电话了

this.tasksService.all();

第二:

@Injectable()
@Inject()
@InjectRepository()
等如何工作。原始文档有点令人困惑:(

typescript nestjs typeorm
1个回答
15
投票

Nest 它建立在 Angular 的思想之上,它涉及很多依赖注入关注点分离。这些想法来自更多面向对象的语言,如 Java 和 C++,尤其是来自像 Spring/SpringBoot 这样的框架。

简介

解决了这个问题,Nest 通过将提供者“连接”在一起做了很多事情,让开发人员不必担心实例化每个类,而是让框架为他们处理这个问题。我先谈谈你的第二点,希望它有助于阐明第一点。

可注入的 Inject 和 InjectRepository 装饰器

TypeScript 中的所有装饰器都用于设置元数据。然后,Nest 将读取此元数据并做出相应的响应。在大多数情况下,这一切都是通过 DI 系统的设置方式在幕后处理的。

  • @Injectable()
    告诉 Nest“嘿,这个类是一个提供程序*,因此它应该能够将值注入其中,并能够注入到其他提供程序中。您的所有服务都将被标记为
    @Injectable()
    还有一些特殊课程。

  • @Inject()
    是一个接受注入令牌**的装饰器。这告诉 Nest“嘿,我想注入与我刚刚给你的令牌绑定的提供程序。创建一个实例并在此处注入它。令牌可以是字符串或符号,但它必须是唯一的(即不与另一个令牌冲突)您可以多次使用同一个令牌。

  • @InjectRepository()
    /
    @InjectModel()
    这些是特殊的
    @Inject()
    装饰器,它们在底层使用标准
    @Inject()
    装饰器来保持注入令牌与 Nest 已经在
    TypeormModule
    MongooseModule 中创建的注入令牌保持一致

它是如何工作的(有点)

现在我们对装饰器设置的元数据有了更多的了解,接下来我们来谈谈 Nest 如何解决依赖关系。 Nest 的作用是扫描每个类并查找其是否为

@Injectable()
的元数据。 (
@Controller()
和其他装饰器确实设置了这个)。然后它查看构造函数中的类,并查明该类是否具有注入标记(除非另有说明,否则类仅由名称确定***)。如果没有,它会检查是否有
@Inject()
装饰器并找到要使用的特定值。如果它找到一个类,它将实例化它,将其保存在缓存中,并将其提供给该类。如果是值,则直接提供给类。

为了更深入地了解,请阅读 DI 以及其他框架如何处理它的文章。 Angular 是一个很好的资源,因为正如我所说,Nest 从中获得了很多灵感

脚注:

*例外包括防护装置、拦截器、管道和过滤器。虽然这些是

@Injectable()
,但他们不是正常的提供者。

** 这是正确的,除非您正在处理类成员注入,在这种情况下您不提供令牌。

*** 您可以使用自定义提供商来管理它

© www.soinside.com 2019 - 2024. All rights reserved.