在对HttpHandler的请求中实现Singleton

时间:2009-09-25 01:30:31

标签: c# design-patterns singleton request httphandler

我正在尝试创建一个单例服务,用于处理对HttpHandler的传入请求。目前,服务正在针对每个请求进行实例化。我调用了包含服务实例的静态类,实现为单例,如下所示:

 public static class ServerApplication {

static Service instance = null;
static readonly object padlock = new object();

/// <summary>
/// Service singleton.
/// </summary>
public static Service Service {
  get {
    lock (padlock) {
      if (instance == null) {
        instance = new Service();
      }
      return instance;
    }
  }
}

使用HttpHandler中的以下调用访问它:

ServerApplication.Service.Process(request);

我在instance = new Service();行设置了一个断点,并且有多个请求 每个请求都会触发断点。

我的目标是跨请求存在的服务,因为它加载并缓存来自大多数请求重用的文件和数据库的大量数据。

有人能看出出了什么问题吗?

3 个答案:

答案 0 :(得分:1)

HTTP旨在建立多个并发连接,我不知道你想要打破这个,除非你在页面加载上建立很少的连接。也就是说,也许你可以将HttpHandler保留在Session中?

答案 1 :(得分:1)

有几件事:

  • 如果它是多处理器盒,从技术上讲,您应该使用“volatile”关键字标记共享服务实例,或者使用对MemoryBarrier的调用(请参阅http://blogs.msdn.com/brada/archive/2004/05/12/130935.aspx)。你没有指定架构,很难说这是否真的是问题,但比抱歉更安全。
  • 您应该实现双重检查锁定(例如,在获取“挂锁”锁定之前和之后检查空值)。通过这种方式,您可以进行更便宜的比较,而无需锁定所有后续读取。

这应该涵盖并发前沿。也可能(尽管不太可能)在请求之间卸载AppDomain(即,您在Web目录中编写了一个文件,导致ASP.NET认为您的应用程序已过时),这将导致静态重置。

答案 2 :(得分:0)

一般来说,如果你想要一个单身人士 - 看不出是否必要我通常会这样实现:http://www.vikingworks.dk/page/Creating-a-Singleton-Pattern-i-C.aspx