我是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 通过将提供者“连接”在一起做了很多事情,让开发人员不必担心实例化每个类,而是让框架为他们处理这个问题。我先谈谈你的第二点,希望它有助于阐明第一点。
TypeScript 中的所有装饰器都用于设置元数据。然后,Nest 将读取此元数据并做出相应的响应。在大多数情况下,这一切都是通过 DI 系统的设置方式在幕后处理的。
@Injectable()
告诉 Nest“嘿,这个类是一个提供程序*,因此它应该能够将值注入其中,并能够注入到其他提供程序中。您的所有服务都将被标记为 @Injectable()
还有一些特殊课程。
@Inject()
是一个接受注入令牌**的装饰器。这告诉 Nest“嘿,我想注入与我刚刚给你的令牌绑定的提供程序。创建一个实例并在此处注入它。令牌可以是字符串或符号,但它必须是唯一的(即不与另一个令牌冲突)您可以多次使用同一个令牌。
@InjectRepository()
/@InjectModel()
这些是特殊的 @Inject()
装饰器,它们在底层使用标准 @Inject()
装饰器来保持注入令牌与 Nest 已经在 TypeormModule
和 MongooseModule
中创建的注入令牌保持一致
现在我们对装饰器设置的元数据有了更多的了解,接下来我们来谈谈 Nest 如何解决依赖关系。 Nest 的作用是扫描每个类并查找其是否为
@Injectable()
的元数据。 (@Controller()
和其他装饰器确实设置了这个)。然后它查看构造函数中的类,并查明该类是否具有注入标记(除非另有说明,否则类仅由名称确定***)。如果没有,它会检查是否有 @Inject()
装饰器并找到要使用的特定值。如果它找到一个类,它将实例化它,将其保存在缓存中,并将其提供给该类。如果是值,则直接提供给类。
为了更深入地了解,请阅读 DI 以及其他框架如何处理它的文章。 Angular 是一个很好的资源,因为正如我所说,Nest 从中获得了很多灵感
*例外包括防护装置、拦截器、管道和过滤器。虽然这些是
@Injectable()
,但他们不是正常的提供者。
** 这是正确的,除非您正在处理类成员注入,在这种情况下您不提供令牌。
*** 您可以使用自定义提供商来管理它