2010-06-03 26 views
0

我寫了一個從SessionStateStoreProviderBase繼承的自定義SessionStoreProvider類。我有一個名爲SessionStore的類,它爲我用作存儲會話數據的後端數據庫提供數據訪問層。我創建了一個單實例屬性像下面我的自定義ASP.NET SessionStateStoreProvider中不需要單例類嗎?

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

回到裏面我SessionStoreProvider方法我實例,像這樣

var sessionStore = SessionStore.Instance; 

類我的目標是確保只有一個會話存儲中存在的用戶會話一次。這是一個合理的方法嗎?這會有什麼負面影響?有一個更好的方法嗎?

回答

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

這背後的原因,是它使我們能夠管理靜態單而不必創建任何鎖。像這樣創建一個嵌套類型將允許我們訪問託管單例,因爲知道靜態構造函數最多隻能在需要時調用一次,歸因於懶惰的設計概念。

+0

NM,我現在明白了。 – CountCet 2010-06-03 16:30:04

相關問題