UserRepository为撒不需要@Injectable
为什么这里的 UserRepository 不需要加上 @Injectable 就可以在 databse.module 里作为 providers, 之前那些service却需要?
正在回答 回答被采纳积分+1
Nestjs在处理Providers的这个部分的时候,会把其加入到DI系统中,由于设置了其为Gobal模块,所以导出的UserRepository也可以在其他的模块里面使用,这也是为什么没有加Injectable也可以使用的原因。
关于nestjs的injectable,官方文档并没有更多原理的介绍。
可以参考:https://angular.dev/guide/di
https://v17.angular.io/guide/architecture-services
Nestjs中的很多设计思想是参考了angular
看了下问题含义及老师的解答,感觉该同学的问题没有解答到位!
我来描述一下提问同学及老师的思路。
问题1: 为什么 UserRepository 不加 @Injectable 装饰器 可以作为一个提供者正常使用呢?
提供者在模块类中有4种定义方式 分别是 类 、 { provide: token令牌, useClass: 类 } 、 {provide: token令牌, useFactory: 工厂函数} 、 {provide: token令牌 , useValue: 值}
一个类添加与不添加 @Injectable 装饰器和能不能当作提供者没有关系
但是添加了 @Injectable 装饰器后该类会有几个元数据 , 参考下面文件路径,从源码实现中我们得知使用了该装饰器后,这个类会有 `constants_1.INJECTABLE_WATERMARK` 和 `constants_1.SCOPE_OPTIONS_METADATA` 元数据
node_modules\@nestjs\common\decorators\core\injectable.decorator.js
如果一个类当作提供者时没有使用 @Injectable 则该类会缺失这2个元数据,导致这个类虽然可以被nestjs当作一个提供者实例化管理起来供控制器使用(称为注入)。但是这个提供者类的构造函数中如果依赖别的提供者,nestjs就懵了,实例化这个提供者的时候不会去解析构造函数中的形参 (简单说这个提供者不能被注入)
实际的问题就是,为何没有使用 @Injectable 装饰器,该 UserRepository 类的构造函数中形参可以被 nestjs 依赖注入成功?
- 参与学习 297 人
- 解答问题 366 个
全新打造“技术成长&职业破局”双高体系,深度打通“全栈 + 全流程 +多端+ 提效+AI赋能”,递进式锤炼思维与高阶技能,高效实现能力跃迁,助力成为“驾驭全局,深广兼备,打通多端全栈”的高级工程师
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星