首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tsyringe使用构造函数参数注册服务

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

Stack Overflow用户
提问于 2021-07-28 09:23:33
回答 1查看 1.2K关注 0票数 1

我有一个服务来处理一些数据抓取,我试图用它来使用tsyringe,创建服务的函数会被多次调用(我真的不能对此做任何事情),所以它创建了许多服务实例。我试图将它包装在"container.isRegistered“检查中,但是当我这样做时,它根本不注册服务。

到目前为止,我得到的是:

代码语言:javascript
复制
@singleton()
@injectable()
export class Service implements IService {
  constructor(@inject('arg1') arg1: string, @inject('arg2') arg2: string) {
}

然后我将它注册在另一个文件中:

代码语言:javascript
复制
    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});
    }

在另一个文件中,我将其解析如下:

代码语言:javascript
复制
this.service = container.resolve('IService');

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

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

发布于 2021-12-16 14:05:58

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

代码语言:javascript
复制
import { container, autoInjectable, Lifecycle } from 'tsyringe';
...
container.register<UsersService>('IService', {useClass: UsersService},  { lifecycle: Lifecycle.Singleton } );

更多信息这里和类型这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68557711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档