nestjs控制器注入服务疑问

来源:11-12 JWT实操:sign与解析jwt

慕粉3946981

2024-07-04

在app.module.ts中可以有4种注册服务的方式,其中类是常用的简写形式,那在控制器构造函数中注入相应的服务,其中类的写法形式可以不使用 @Inject 来指定 token 令牌,只需要在构造函数参数中标识类型为相应的服务类即可成功注入。
请问老师在实现原理层面,是如何处理没有使用 @Inject 装饰器也能找到对应服务的机制?

举例
@Controller()
export class AppController {
constructor(
@Inject(token) service1,
service2: Service2
) { }

其中 @Inject 装饰器可以保存被装饰的参数token值,以便nestjs通过元数据往该参数传递正确的值,那 service2 参数,nestjs如何知道使用哪个服务往该参数中传递正确的值?

写回答

1回答

Brian

2024-07-04

nest服务在启动的时候会把所有provider进行初始化,包含controller中的constructer中的依赖的service,放在DI容器中,你当成是一个大对象,这个token相当于是你初始化的实例的key,而有一些默认的类,大多时候没有加@Inject的类,是不需要指定这个具体的key,nestjs自己根据你需要调用的实例的类型来判断的。

参考这一块的代码:

装修器:https://github.com/nestjs/nest/blob/6a791dc/packages/common/decorators/core/injectable.decorator.ts

还有controller装饰器,都会打个元信息标签INJECTABLE_WATERMARK,然后DI注册的过程,重点看这个文件:

https://github.com/nestjs/nest/blob/6a791dc/packages/core/scanner.ts


0
0

NestJS 入门到实战 前端必学服务端新趋势

近几年快速发展的Node.js框架,掌握未来前端工程师后端开发能力

569 学习 · 238 问题

查看课程