2012-04-10 54 views
2

在我的asp.net MVC項目中,我有一個會話幫助器類,用於設置和檢索會話值。這是這個類:asp.net mvc設置會話值與線程安全

public class SessionManager 
{ 
    public static string UserName 
    { 
     get 
     { 
      return HttpContext.Current.Session[SessConstants.UName] ; 
     } 
     set 
     { 
      HttpContext.Current.Session[SessConstants.UName] = value; 
     } 
    } 
} 

正如你所看到的屬性是靜態的。我用這個在我的代碼如下:

//For setting values  
SessionManager.UserName = ""; 

//For retrieving values 
strLoggedinUser = SessionManager.UserName; 

問題:

  1. 是否喜歡這些線程靜態屬性安全的設置爲HttpContext.Current.Session [ 'someVar']?
  2. 我應該創建一個實例屬性,並在我從MVC控制器類繼承的基礎控制器中實例化SessionManager。然後我可以讓我的所有控制器繼承我的自定義控制器而不是MVC一個

想法?

感謝您的時間...

+0

如果你使用SessionManager來控制一個控制器或者來自特定的控制器實例,那麼線程安全不是問題,因爲控制器的新實例是爲每個請求創建的,並且會話是特定於會話的。但是,根據您在環境中使用的負載平衡方案,根本不建議使用會話。 – Maess 2012-04-10 17:48:59

+0

當前SessionManager是一個幫助程序項目。啓用線程安全的舉措是:1)使其成爲具有實例屬性的實例類,並且2)使該類在從MVC控制器類繼承的定製基礎控制器類中可用。 – user20358 2012-04-10 17:51:17

+0

所以你是說如果我現在將它移動到自定義控制器類中,它將會是線程安全的?即使屬性是靜態的? – user20358 2012-04-10 17:52:04

回答

1

這是一個想法。 (可能不完全是你的問題的答案,但我認爲Maess在註釋中處理了這個問題。)

爲了不使用單獨的SessionManager類來封裝會話狀態變量,爲什麼不使用擴展方法呢?

public static class SessionExtensionMethods 
{ 
    private const string SessionUserNameKey = "UName"; 

    // set the session value (pass null to remove) 
    public static void UserName(this HttpSessionStateBase session, string value) 
    { 
     if (value == null) session.Remove(SessionUserNameKey); 
     else session[SessionUserNameKey] = value; 
    } 

    // get the session value 
    public static string UserName(this HttpSessionStateBase session) 
    { 
     var value = session[SessionUserNameKey]; 
     return value != null ? value.ToString() : null; 
    } 
} 

然後,在你的控制器,你可以做到這一點得到&設置會話值:

// set the value 
Session.UserName("SomeUserName"); 

// get the value 
var sessionUserName = Session.UserName(); 

// clear the value 
Sesssion.UserName(null); 

沒有必要在此基礎控制器類。所有你需要做的就是確保你的控制器引用SessionExtensionMethods類聲明的名字空間。

+0

這看起來很有趣:) – user20358 2012-04-11 07:07:44

+0

它如何確保線程安全? – RezaRahmati 2016-11-15 15:35:14