我会先说一句:我对 WCF 有点陌生。
我正在开发一个服务器端例程,该例程负责执行大量业务逻辑。它可以通过 WCF 从客户端访问。
我的主要 WCF 方法调用其他几个私有(private)方法。我没有将业务逻辑所需的所有“查找数据”传递给每个私有(private)方法,而是决定使用一个名为 DataProvider 的类的单例实例,该类包含所有这些“查找数据”。
在例程结束时,我“释放”DataProvider 的查找数据,以便下次执行例程时,将使用最新的查找数据。
所以,这是一个简化的例子:
public void Generate()
{
try
{
//populate singleton DataProvider with it's lookup data...
DataProvider.Instance.LoadLookupData();
//do business logic...
}
finally
{
//release provider's lookup data...
DataProvider.Release();
}
}
在我有两个不同的客户端同时(或几乎)同时执行该方法之前,这非常有用。出现问题是因为它们共享同一个单例实例,并且先完成的任务将在另一个任务完成之前释放 DataProvider。
所以...
我在这里有哪些选择?
我想避免传递所有查找数据,因此单例模式(或某些衍生模式)似乎是个不错的选择。我还需要能够支持多个客户端同时调用该方法。
我相信 WCF 服务被配置为“Per-Call”。我不确定是否有一种方法可以配置 WCF 服务,以便在服务调用之间不共享静态内存。
如有任何帮助,我们将不胜感激。
最佳答案
默认情况下,WCF 使用“每次调用”,这意味着为每个客户端调用创建 WCF 服务的新实例。现在,由于您实现了单例,即使创建了 WCF 的新实例,它仍然会调用您的单例。
如果您想创建为每次调用创建的查找(就像您现在所做的那样),您不应该将其作为单例执行。这样每个调用您的方法的客户端都会有新的查找实例,我认为这是您的意图。
但是,如果您的查找变化不那么快,我建议在所有调用之间共享它,这将提高 WCF 服务的性能。您需要将 WCF 服务声明为
InstanceContextMode = InstanceContextMode.Single
ConcurrencyMode = ConcurrencyMode.Multiple
它的作用是通过 WCF 为您自动创建单例,因此您不必自己做,其次它将支持 > 1 个并发用户 (ConcurrencyMode.Multiple)。
现在,如果您的查找正在更改并且需要在一段时间后重新加载,我仍然建议您使用
InstanceContextMode = InstanceContextMode.Single
ConcurrencyMode = ConcurrencyMode.Multiple
但在您的代码中缓存它,然后在特定时间或相对时间(1 小时)过期您的缓存。
以下是一些可能对您有帮助的链接: 3 ways to do WCF instance management (Per call, Per session and Single)
希望这会有所帮助。
关于c# - WCF 服务方法中单例模式的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6898267/