请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

nestjs控制器注入服务疑问

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

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

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

正在回答 回答被采纳积分+3

插入代码

1回答

Brian 2024-07-04 23:45:42

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 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号