如何在整个服务中使用单例安装



这就是我实现单例类的方式

import { AClient } from 'libbrary'
import { Container, Service } from 'typedi';
@Service()
class MyClass {
private client: AClient;

static getInstance(): MyClass {
return Container.get(MyClass);
}

getClient(): AClient {
if(this.client !== null){
return this.client;
}
this.client = new AClient();
return this.client;
}
}

这里的主要焦点是使用Acliet((
我正在以以下方式实现此客户端的方法。

class AClientMethodsImplementation {
async getSomeData() {
// I need client here so that I can use client.get()
}
}

现在我应该在服务中使用这些方法。

class NeedDataHere {
// Not only here, in the entire project I need this many places.
// should I create AClientMethodsImplementation() instance everytime?
// If that is the case what is the point of a singleton?
// How to achieve this? What is the correct approach?
}

我是否遵循了正确的方法?或者,处理这种情况的最佳方法是什么?我说这是一个问题,因为我观察到,通过每次创建新的AClientMethodsImplementation类来点击getSomeData((,即使我将输入数据更改为该函数,也会得到相同的结果。我怀疑它在某处缓存。

这实际上取决于您的场景。如果AClientMethodsImplementation是无状态的(它在方法调用之间不会保存与实例相关的数据(,则应该声明其所有成员static:

class AClientMethodsImplementation {
static async getSomeData() {
AClient client = MyClass.getInstance().getClient();
}
}
class NeedDataHere {

// Call static methods
let data = AClientMethodsImplementation.getSomeData();
}

如果AClientMethodsImplementation应该存储与实例相关的数据,那么你当然必须创建一个新的实例(除了特定的方法不会改变实例。在这种情况下,它可以是static(
如果您希望此实例在整个应用程序中是相同的,那么您可以将AClientMethodsImplementation实现为Singleton。

Singleton模式的首选替代方案是使用依赖注入(IoC模式的一种实现(。通过这种方式,您可以共享同一个实例,但不会牺牲松散耦合和可测试性。

通常,当您想在全局范围中使用单个对象状态时,您会使用共享实例(通过依赖注入或Singleton(,例如像cookie这样的会话对象。另一个用例是,由于资源分配或实例化过于耗时,实例化可能过于昂贵。然后分配一次资源,例如数据库/服务连接,然后重用它(共享资源(。另一种使用情况是提供对共享资源(例如数据高速缓存(的受控访问。例如,您通常在整个应用程序中使用共享记录器实例。

在检查代码时,共享AClient实例的好处可能是提高了性能。如果你可以说客户端暴露了昂贵的共享资源或数据,或者通常创建多个实例的成本太高,那么共享该实例是值得的。显然,您仍然创建了AClientMethodsImplementation的多个实例,这并不会使共享实例变得多余。

最新更新