gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:26:44 32 4
gpt4 key购买 nike

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

第一的:
我正在观看我们有名为 Task 的服务的教程

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

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

这里 TasksService仅用作一种类型,而不是我猜的类。在普通的 typescript 中,我会写这样的东西
let task = new TasksController(new TasksService())
然后我就可以调用 this.tasksService.all();
第二:
如何 @Injectable() , @Inject() , @InjectRepository()等作品。原始文档有点困惑:(

最佳答案

嵌套它建立在 Angular 的思想之上处理很多 Dependency InjectionSeparation of Concerns .这些想法来自更多面向对象的语言,如 Java 和 C++,尤其是来自像 Spring/SpringBoot 这样的框架。 .
介绍
除此之外,Nest 通过将提供程序“连接”在一起做了很多事情,让开发人员不必担心实例化每个类,而是让框架为他们处理。我会先谈谈你的第二点,希望它有助于阐明第一点。
Injectable Inject 和 InjectRepository 装饰器
typescript 中的所有装饰器都用于设置元数据。 Nest 将读取此元数据并做出相应的响应。在大多数情况下,这一切都是通过 DI 系统的设置方式在幕后处理的。

  • @Injectable()告诉 Nest “嘿,这个类是一个提供者*,因此它应该能够将值注入(inject)其中并能够注入(inject)其他提供者。您的所有服务将被标记为 @Injectable() 以及一些特殊的类。
  • @Inject()是一个接受注入(inject) token **的装饰器。这告诉 Nest “嘿,我想注入(inject)与我刚刚给你的 token 相关的提供程序。创建一个实例并在此处注入(inject)它。 token 可以是字符串或符号,但它必须是唯一的(即不与另一个冲突) provider). 使用可以多次使用同一个 token 。
  • @InjectRepository()/@InjectModel()这些是特殊的@Inject()使用标准 @Inject() 的装饰器引擎盖下的装饰器,以保持注入(inject) token 与 Nest 已经在 TypeormModule 中创建的注入(inject) token 一致和 MongooseModule

  • 它是如何工作的(有点)
    所以现在我们对装饰器设置的元数据有了更多的了解,让我们来谈谈 Nest 如何解决依赖关系。 Nest 的作用是扫描每个类并查找元数据是否为 ​​ @Injectable()或不。 ( @Controller() 和其他装饰器确实设置了这个)。然后它查看构造函数中的类并确定该类是否具有注入(inject) token (除非另有说明,否则类仅由名称确定***)。如果没有,它会检查是否有 @Inject()装饰器并找到它的特定使用值(value)。如果它找到一个类,它将实例化它,将其保存在缓存中,并将其提供给该类。如果是值,则直接提供给类。
    为了更深入地了解,请阅读 DI 以及其他框架如何处理它。 Angular 是一个很好的资源,因为正如我所说,Nest 从中获得了很多灵感
    脚注:
    *异常(exception)情况包括 guard 、拦截器、管道和过滤器。虽然这些是 @Injectable()他们不是正常的提供者。
    ** 这是真的,除非您正在处理类成员注入(inject),在这种情况下您不提供 token 。
    *** 您可以使用自定义提供程序来管理它

    关于typescript - nestjs 如何工作并使用参数运行构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59867345/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com