c# - WCF 服务方法中单例模式的问题

标签 c# .net wcf web-services singleton

我会先说一句:我对 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/

相关文章:

c# - 如何使用 OOXML 删除 WordProcessingML 中的 TableRow?

JavaScript 上的 C# httpwebrequest

c# - 具有未指定类型的通用方法可能吗?

c# - 某些操作后调用 pageload

wcf - WCF RIA 服务可以自托管吗?

C#:Base64编码

c# - Regex.Matches 每行返回一个匹配项,而不是每个 "word"

.net - TransactionScope 无法与并行扩展一起使用?

wcf - 无法理解 WCF 错误消息,需要帮助

c# - WCF回调-同步执行