代码之家  ›  专栏  ›  技术社区  ›  Xander

WCF Singleton指南

  •  0
  • Xander  · 技术社区  · 11 年前

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

    我最初的想法是让它成为一个静态的,但我知道当应用程序池被重置,静态变量被清除时,会有一些奇怪的事情。

    人们通常处理这种情况的最佳实践方式是什么?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Laurence Adams    11 年前

    我不知道静态变量和AppPool重置有什么奇怪之处。由于我们处理的是一个静态对象,因此在服务请求之前,可以保证线程安全初始化。

    我认为这里最重要的问题是:“您的服务会处理多个同时请求吗?”。换句话说 ConcurrencyMode 您的服务设置?默认值为Single,这意味着您的服务一次只能服务一个请求。在这种情况下,我们不必担心单例对象的线程安全性。

    如果ConcurrencyMode==Multiple,则可以通过多个同时请求访问单例对象。在这种情况下,您必须确保单例对象是 thread safe

    下面的代码在大批量生产系统中很好地为我服务。请注意,由于SearchManager类是线程安全的,因此已指定ConcurrencyMode.Multiple。我确信这种设置可以改进。

    [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,这意味着每个请求都使用服务的新实例进行服务

    推荐文章