我会继续前言,并说:我对WCF有点新鲜。WCF服务方法中单例模式的问题
我正在做一个服务器端例程,负责做大量的业务逻辑。它可以通过WCF从客户端访问。
我的主要WCF方法调用其他几个私有方法。我决定使用名为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服务,以便在服务调用之间不共享静态内存。
任何帮助,将不胜感激。
有人纠正我,如果我在这里错了,但将查找数据传递到另一个类不会创建全部数据的全新副本,对吧?难道它不只是数据参考的副本吗? (当然,除非在服务范围内序列化,否则在这种情况下听起来不太可能) –
我想了解拥有单身人士课程的动机。是否只创建一次,并且您的服务的所有调用者都需要获取相同的数据实例?还是像你的服务返回的调用者应该得到相同的数据(会话)? – Kangkan
“单身人士”的原因是业务逻辑创建了大约30多种不同类型的对象。每个人都需要访问查找数据。也许我很懒,但我不想为30多个不同的构造函数提供相同的参数。大声笑。我觉得单例是最简洁的方法,因此每个对象都可以轻松访问查找数据。 –