2015-02-23 23 views
0

我有我想包装在我的WCF服务中的第三方对象。它是一个单例对象,我希望它在WCF初始化并在WCF关闭时关闭时启动。WCF Singleton的指导

我最初的想法是使这是一个静态的,但我知道有很奇怪的事情,当应用程序池被重置和静态变量被消灭。

人们通常会处理这种情况的最佳做法是什么?

回答

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,这意味着每个请求被服务用中的service的新实例