1

我有一个服务来处理一些数据获取,我正在尝试使用 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');

尝试检查它是否已注册会完全停止服务的注册,但如果没有,我将运行多个实例。该服务主要处理数据获取,它只应该在启动时获取一些数据,但我看到很多调用都是这样做的。我在服务构造函数中放了一些日志,我可以看到它被创建了很多次。

谢谢你的帮助!

4

1 回答 1

0

当您使用方法注册在 IoC 中创建新注册表时,实际上您在服务上创建了另一个与类内的装饰器 @singlton 无关的链接。您需要在注册方法中设置附加参数。它将描述可注入对象的生命周期。因为默认它不使用单例。你应该这样做:

import { container, autoInjectable, Lifecycle } from 'tsyringe';
...
container.register<UsersService>('IService', {useClass: UsersService},  { lifecycle: Lifecycle.Singleton } );

更多信息在这里和类型在这里

于 2021-12-16T14:05:58.390 回答