![](/img/trans.png)
[英]express/tsyringe TypeError: Cannot read properties of undefined (reading 'service')
[英]Registering service with constructor arguments using tsyringe
我有一个服务来处理一些数据获取,我正在尝试将 tsyringe 与它一起使用,创建服务的函数被多次调用(我对此无能为力),因此它正在创建该服务的许多实例。 我试图将它包装在“container.isRegistered”检查中,但是当我这样做时,它根本没有注册服务。
到目前为止我所拥有的是:
@singleton()
@injectable()
export class Service implements IService {
constructor(@inject('arg1') arg1: string, @inject('arg2') arg2: string) {
}
然后我在另一个文件中注册它:
if (!container.isRegistered('arg1', true)) {
container.register('arg1', {useValue: this.arg1});
}
if (!container.isRegistered('arg2', true)) {
container.register('arg2', {useValue: this.arg2});
}
if (!container.isRegistered('IService', true)) {
container.register('IService', {useClass: Service});
}
在另一个文件中,我像这样解决它:
this.service = container.resolve('IService');
尝试检查它是否已注册根本停止服务被注册,但如果我没有,我有多个实例正在运行。 该服务主要处理数据获取,它只应该在启动时获取一些数据,但我看到很多调用都是这样做的。 我在服务构造函数中放了一些日志,我可以看到它被创建了很多次。
谢谢你的帮助!
当您使用方法 register 在 IoC 中创建新注册表时,实际上您在服务上创建了另一个与类内的装饰器 @singlton 无关的链接。 您需要在 register 方法中设置附加参数。 它将描述可注入对象的生命周期。 因为默认情况下它不使用单例。 你应该这样做:
import { container, autoInjectable, Lifecycle } from 'tsyringe';
...
container.register<UsersService>('IService', {useClass: UsersService}, { lifecycle: Lifecycle.Singleton } );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.