拥有 WCF 单例的指南
Guidance for having a WCF Singleton
我有一个第 3 方对象,我想将其包装在我的 WCF 服务中。它是一个单例对象,我希望它在 WCF 初始化时初始化并在 WCF 关闭时关闭。
我最初的想法是让它成为静态的,但我知道当应用程序池被重置并且静态变量被清除时会发生奇怪的事情。
人们通常处理此类情况的最佳做法是什么?
我不知道静态变量和 AppPool 重置有任何异常。由于我们处理的是静态对象,因此可以保证在服务请求之前进行线程安全的初始化。
我认为这里最重要的问题是:"Will your service handle multiple simultaneous requests?"。换句话说,您的服务的 ConcurrencyMode 设置是什么?默认值为 Single,这意味着您的服务一次只会处理一个请求。这样的话,我们就不用担心单例对象的线程安全了。
如果 ConcurrencyMode == Multiple 那么您的单例对象可以被多个同时请求访问。在这种情况下,您必须确保您的单例对象是 thread safe
下面的代码在大批量生产系统中为我提供了很好的服务。请注意,已指定 ConcurrencyMode.Multiple,因为 SearchManager class 是线程安全的。我确信这个设置可以改进。
[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,这意味着每个请求都由一个新的服务实例提供服务
我有一个第 3 方对象,我想将其包装在我的 WCF 服务中。它是一个单例对象,我希望它在 WCF 初始化时初始化并在 WCF 关闭时关闭。
我最初的想法是让它成为静态的,但我知道当应用程序池被重置并且静态变量被清除时会发生奇怪的事情。
人们通常处理此类情况的最佳做法是什么?
我不知道静态变量和 AppPool 重置有任何异常。由于我们处理的是静态对象,因此可以保证在服务请求之前进行线程安全的初始化。
我认为这里最重要的问题是:"Will your service handle multiple simultaneous requests?"。换句话说,您的服务的 ConcurrencyMode 设置是什么?默认值为 Single,这意味着您的服务一次只会处理一个请求。这样的话,我们就不用担心单例对象的线程安全了。
如果 ConcurrencyMode == Multiple 那么您的单例对象可以被多个同时请求访问。在这种情况下,您必须确保您的单例对象是 thread safe
下面的代码在大批量生产系统中为我提供了很好的服务。请注意,已指定 ConcurrencyMode.Multiple,因为 SearchManager class 是线程安全的。我确信这个设置可以改进。
[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,这意味着每个请求都由一个新的服务实例提供服务