Far*_*had 4 typescript typeorm nestjs
我是 nestJS 的新手,也找不到太多关于它的信息,所以我也不敢深入研究它的源代码(也是打字稿的初学者)。我真的很想知道这些东西是如何工作的,我将在下面提到
第一:我正在观看我们有名为 Task 的服务的教程
export class TasksController {
constructor(private readonly tasksService: TasksService) { }
Get()
index() {
this.tasksService.all();
}
}
Run Code Online (Sandbox Code Playgroud)
这里TasksService仅用作一种类型,而不是我猜的类。在普通的打字稿中,我会写这样的东西
let task = new TasksController(new TasksService())
然后我就可以打电话了 this.tasksService.all();
二:如何@Injectable(),@Inject(),@InjectRepository()等工程。原始文档有点混乱:(
Nest 它建立在Angular的思想之上,Angular处理了很多依赖注入和关注点分离。这些想法来自更多面向对象的语言,如 Java 和 C++,尤其是来自Spring/SpringBoot等框架。
顺便说一句,Nest 通过将提供者“连接”在一起来做很多事情,让开发人员不必担心实例化每个类,而是让框架为他们处理。我将首先谈谈你的第二点,希望它有助于阐明第一点。
打字稿中的所有装饰器都用于设置元数据。然后 Nest 将读取此元数据并做出相应的响应。在大多数情况下,这一切都由 DI 系统的设置方式处理。
@Injectable()告诉 Nest “嘿,这个类是一个提供者*,因此它应该能够将值注入其中并能够注入其他提供者。您的所有服务都将@Injectable()与一些特殊类一起标记。
@Inject()是一个接受注入令牌**的装饰器。这告诉 Nest “嘿,我想注入与我刚刚给你的令牌绑定的提供者。创建一个实例并将其注入这里。令牌可以是字符串或符号,但它必须是唯一的(即不与另一个冲突provider). 使用可以多次使用同一个令牌。
@InjectRepository()/@InjectModel()这些是特殊的@Inject()装饰器,它们使用@Inject()引擎盖下的标准装饰器来使注入令牌与 Nest 已经在TypeormModule和 中创建的注入令牌保持一致MongooseModule
现在我们对装饰器设置的元数据有了更多的了解,让我们来谈谈 Nest 如何解决依赖关系。Nest 的作用是扫描每个类并查找元数据是否@Injectable()存在。(@Controller()和其他装饰者确实设置了这个)。然后它查看构造函数中的类并找出该类是否具有注入标记(除非另有说明,否则类仅由名称确定***)。如果没有,它会检查是否有@Inject()装饰器并找到要使用的特定值。如果它找到一个类,它将实例化它,将其保存在缓存中,并将其提供给该类。如果是值,则直接提供给类。
要更深入地了解 DI 以及其他框架如何处理它。Angular 是一个很好的资源,因为正如我所说,Nest 从中获得了很多灵感
*例外情况包括防护装置、拦截器、管道和过滤器。虽然这些是@Injectable()他们不是正常的提供者。
** 这是真的,除非您正在处理类成员注入,在这种情况下您不提供令牌。
*** 您可以使用自定义提供程序进行管理
| 归档时间: |
|
| 查看次数: |
2416 次 |
| 最近记录: |