我有一个服务来处理一些数据抓取,我试图用它来使用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');试图检查它是否已注册将完全阻止服务注册,但如果没有,则会有多个实例正在运行。该服务主要处理数据获取,它应该只在启动时获取一些数据一次,但是我看到了很多这样的调用。我在服务构造函数中放置了一些日志,我可以看到它被创建了很多次。
谢谢你的帮忙!
发布于 2021-12-16 14:05:58
当您使用方法寄存器在IoC中创建新注册表时,实际上您在服务上创建了另一个链接,该链接与类中的装饰器@singlton无关。您需要在寄存器方法中设置其他参数。它将描述可注入对象的生命周期。因为默认情况下,它不使用Singleton。你应该这样做:
import { container, autoInjectable, Lifecycle } from 'tsyringe';
...
container.register<UsersService>('IService', {useClass: UsersService}, { lifecycle: Lifecycle.Singleton } );https://stackoverflow.com/questions/68557711
复制相似问题