我有一个第三方对象,我想在我的WCF服务中包装。它是一个单例对象,我希望它在WCF关闭时WCF初始化和关闭时初始化。
我最初的想法是让它成为一个静态的,但我知道当应用程序池重置并且静态变量被清除时会有一些奇怪的事情。
人们通常会处理此类情况的最佳做法是什么?
答案 0 :(得分:1)
我没有意识到静态变量和AppPool重置的任何异常。由于我们正在处理静态对象,因此在请求服务之前,您可以保证线程安全初始化。
我认为这里最重要的问题是:"您的服务是否会同时处理多个请求?"。换句话说,您的服务的ConcurrencyMode设置是什么?默认值为Single,这意味着您的服务一次只能为一个请求提供服务。在这种情况下,我们不必担心单例对象的线程安全性。
如果ConcurrencyMode == Multiple,则可以通过多个同时请求访问您的单例对象。在这种情况下,您必须确保您的单件对象是thread safe
以下代码在大批量生产系统中很有用。请注意,已指定ConcurrencyMode.Multiple,因为SearchManager类是线程安全的。我确定这个设置可以改进。
[ServiceBehavior(IncludeExceptionDetailInFaults = true, ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)]
public class SearchService : ISearchService
{
// My Singleton
private static SearchManager engine = SearchManager.GetEngine();
// all subsequent services make use of the engine instance
}
此代码还指定了InstanceContextMode.PerCall,这意味着每个请求都使用serivce的新实例进行服务