Является ли мой одноэлементный класс ненужным в моем настраиваемом ASP.NET SessionStateStoreProvider? - PullRequest
0 голосов
/ 03 июня 2010

Я написал собственный класс SessionStoreProvider, который наследуется от SessionStateStoreProviderBase. У меня есть класс с именем 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 Ответ

1 голос
/ 03 июня 2010

Несмотря на то, что двойная проверка блокировки работает для большинства сценариев, для эффективной работы статического синглтона может потребоваться дополнительная работа:

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() { }
  }
}

Причина этого в том, что она позволяет нам управлять статическим синглтоном без необходимости создавать какие-либо блокировки. Создание такого вложенного типа позволит нам получить доступ к управляемому одноэлементному файлу, зная, что статический конструктор можно вызывать не более одного раза, когда это требуется, приписывая ленивую концепцию проектирования.

...