2009-06-08 33 views
0

我將所有直接會話交互分隔到一個單獨的類中,並將其設置爲靜態,因爲我不想多次創建一個新對象。但是,我希望確保沒有併發問題或其他不可思議的驚喜。靜態類中的包裝會話處理

下面是代碼:

public static class HttpHelper 
{ 

    public static string Get(string key) 
    { 
     object value = HttpContext.Current.Request.QueryString[key]; 
     return (value == null) ? null : value.ToString(); 
    } 


    public static string Post(string key) 
    { 
     object value = HttpContext.Current.Request.Form[key]; 
     return (value == null) ? null : value.ToString(); 
    } 

    public static string Session(string key) 
    { 
     object value = HttpContext.Current.Session[key]; 
     return (value == null) ? null : value.ToString(); 
    } 

    public static void ClearSession(string key) 
    { 
     HttpContext.Current.Session[key] = null; 
    } 

    public static void StoreInSession(string key, object value) 
    { 
     HttpContext.Current.Session[key] = value; 
    } 

} 

回答

1

如果有任何這方面的功能性問題,許多應用程序早就失敗了:)

不過,我想指出,這種模式是不是很適合單元測試。您可能需要考慮製作方法實例成員並將Session提供者傳遞給此HttpHelper對象的構造函數。

+0

謝謝雷克斯,我可以這麼做。 只要這個模型通過。我只是想確認會話變量不會在用戶之間共享,我想確保會話對每個用戶都是唯一的。 – sarsnake 2009-06-08 18:43:40

1

下面是一個類似的問題,可以幫助你的答案 - 它將使您避免使用鍵完全訪問會話值,並給您的類型安全性:

How to access session variables from any class in ASP.NET?

+0

在這種情況下,我必須爲每個var創建屬性的價格,我會堅持使用鍵。 – sarsnake 2009-06-08 18:46:58

+0

@gnomixa你的推理看起來很奇怪。爲每個會話對象創建屬性的成本總是會低於在字典鍵中輸入錯字的成本。 「道具選項卡選項卡」完成! – jfar 2009-06-08 19:16:30

+0

閱讀我的評論給其他答案:我將密鑰存儲在靜態類中,因此我不輸入魔法字符串。類型轉換是另一回事,雖然大聲笑 – sarsnake 2009-06-08 19:20:34

0

從概念上講,應該沒事。即使在您可能會遇到競爭條件的部分回發(EG,AJAX)場景中,您也應該可以。會話狀態使用reader/writer lock來保證您的安全。

我傾向於在我的項目中做類似的事情,儘管我很喜歡將實際的有效會話條目(鍵等)封裝到屬性中。我發現它使應用程序代碼更加一致,並且 - 更重要的是 - 消除了魔術鍵字符串上拼寫錯誤的可能性,這會使應用程序以非常意想不到的方式運行。

如果您爲應用程序狀態做類似的事情,那麼在設置它們之前,您必須確保您鎖定和解鎖值。

0

我不知道是這個包裝有用的,但我認爲你可以做以下改進 而不是

public static string Get(string key) 
{ 
    object value = HttpContext.Current.Request.QueryString[key]; 
    return (value == null) ? null : value.ToString(); 
} 

可以使用

public static string Get(string key) 
{ 
    return HttpContext.Current.Request.QueryString[key]; 
} 

同爲Post方法。 這是真的,你的Session方法只返回字符串,如果你可以通過StoreInSession方法在會話中存儲任何對象?