繁体   English   中英

使用 tsyringe 使用构造函数参数注册服务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM