我的自定义ASP.NET SessionStateStoreProvider中不需要我的单例类吗?

时间:2010-06-03 15:45:23

标签: c# asp.net session-state

我编写了一个继承自SessionStateStoreProviderBase的自定义SessionStoreProvider类。我有一个名为SessionStore的类,它为我用作存储会话数据的后端的数据库提供数据访问层。我已经创建了一个单例实例属性,如下面的

   public static SessionStore Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                        instance = new SessionStore();
                }
            }
            return instance;
        }
    }

回到我的SessionStoreProvider方法中,我正在实例化这样的类

 var sessionStore = SessionStore.Instance;

我的目标是确保一次只存在一个用户会话的会话存储。这是一个合理的方法吗?这会产生任何负面影响吗?有一个更好的方法吗?

1 个答案:

答案 0 :(得分:1)

尽管双重检查锁定适用于大多数情况,但使静态单例有效工作可能需要一些额外的工作:

public class SessionStore {
  /// <summary>
  /// Gets the current instance of <see cref="SessionStore" />.
  /// </summary>
  public static SessionStore Instance {
     get {
      return SessionStoreInternal.Instance;
    }
  }

  /// <summary>
  /// Supports lazy initialisation of a <see cref="SessionStore" /> instance.
  /// </summary>
  internal class SessionStoreInternal {
     /// <summary>
     /// The current instance of <see cref="SessionStore" />.
     /// </summary>
    internal static readonly SessionStore Instance = new SessionStore();

    /// <summary>
    /// Required to stop the Instance field being initialised through BeforeFieldInit     behaviour,
    /// allowing us to only initialise the field when it is accessed.
    /// </summary>
    static SessionStoreInternal() { }
  }
}

这背后的原因是,它允许我们管理静态单例而无需创建任何锁。创建这样的嵌套类型将允许我们访问托管单例,知道静态构造函数在需要时最多可被调用一次,归因于惰性设计概念。