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



我是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()等如何运作。原始文档有点令人困惑:(

Nest 它建立在 Angular 的思想之上,它处理了很多依赖注入和关注点分离。这些想法来自更多的面向对象语言,如Java和C++,特别是来自Spring/SpringBoot等框架。

介绍

有了这个,Nest通过"连接"提供程序来做很多事情,允许开发人员不必担心实例化每个类,而是让框架为他们处理。我将首先谈谈你的第二点,希望它能帮助阐明第一点。

Injectable Inject 和 InjectRepository Decorators

打字稿中的所有装饰器都用于设置元数据。然后,Nest 将读取此元数据并相应地响应它。在大多数情况下,这一切都是通过如何设置 DI 系统来处理的。

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

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

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

它是如何工作的(有点(

因此,现在我们对装饰器设置的元数据有了更多的了解,让我们谈谈 Nest 如何解决依赖关系。nest的作用是扫描每个类并查找元数据是否@Injectable()(@Controller()和其他装饰器确实设置了这一点(。然后,它查看构造函数中的类,并确定该类是否具有注入令牌(除非另有说明,否则类仅由名称确定***(。如果没有,它会检查是否有它的@Inject()装饰器,并找到它的特定值来使用。如果它找到一个类,它将实例化它,将其保存在缓存中,并将其提供给该类。如果是值,则直接提供给类。

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

脚注:

*例外情况包括防护装置、拦截器、管道和过滤器。虽然这些是@Injectable()但它们不是正常的提供者。

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

您可以使用自定义提供程序进行管理此操作

最新更新