2011-12-21 58 views
4

我需要在會話中堅持一些數據。 我寫了很多的屬性,如認爲:更好的方式來管理會話數據

public List<string> FillOrder 
{ 
    get { return Session[SessionKeys.QueryFillOrder] as List<string> ?? new List<string>(); } 
    set { Session[SessionKeys.QueryFillOrder] = value; } 
} 

當我要消耗這個數據我必須寫這樣的代碼:

List<string> fillOrder = FillOrder; 
fillOrder.Add(accordion.ID); 
FillOrder = fillOrder; 

在我看來,這麼難看,因爲我寧願做即:

FillOrder.Add(accordion.ID); 

但這樣我的價值將不會被保存回會話。

你能想出更好的方法來達到同樣的效果嗎?

非常感謝!

回答

6

我一直使用包裝類圍繞ASP.NET會話來簡化會話變量訪問:

public class MySession 
{ 
    // private constructor 
    private MySession() 
    { 
     FillOrder = new List<string>(); 
    } 

    // Gets the current session. 
    public static MySession Current 
    { 
     get 
     { 
     var session = (MySession)HttpContext.Current.Session["__MySession__"]; 
     if (session == null) 
     { 
      session = new MySession(); 
      HttpContext.Current.Session["__MySession__"] = session; 
     } 
     return session; 
     } 
    } 

    // **** add your session properties here, e.g like this: 
    public List<string> FillOrder {get; set; } 
    public string Property1 { get; set; } 
    public DateTime MyDate { get; set; } 
    public int LoginId { get; set; } 
} 

這個類存儲本身一個實例在ASP.NET會話,並允許您訪問您的會話從任何類的類型安全方式的性能,例如像這樣:

MySession.Current.FillOrder.Add(accordion.ID); 

int loginId = MySession.Current.LoginId; 

string property1 = MySession.Current.Property1; 
MySession.Current.Property1 = newValue; 

DateTime myDate = MySession.Current.MyDate; 
MySession.Current.MyDate = DateTime.Now; 

這種方法有幾個優點:

  • 您可以在構造函數中初始化會話變量(即new List<string>
  • 這樣可以節省你很多的類型轉換
  • 你不必使用整個應用程序(如會話[「登錄ID」]硬編碼的會話密鑰
  • 您可以記錄您的會議項目通過MySession的的屬性添加XML文檔註釋
+0

謝謝你的回答!而且,使用這種方法,MySession.Current.FillOrder.Add(accordionID)會自動保存在Session中?我無法理解背後的魔力! :D – Alessandro 2011-12-21 09:19:27

+0

是的!當您第一次訪問MySession.Current時,將創建一個MySession的新實例並存儲在ASP.NET會話中。從那以後,你將一直與那個實例一起工作。設置一個斷點爲Current屬性的getter,以查看它是如何工作的。 – M4N 2011-12-21 09:21:29

+0

是的,很明顯,我總是與那個實例一起工作。我無法理解的是它將變化持續到Session。 – Alessandro 2011-12-21 09:23:04

0

你可以寫一個自己的類實現的ICollection或IList的,還有你會實現添加爲會議[...] = ...

1

你可以也使用擴展方法,但我認爲M4N的例子可能是好:

編輯使其成爲通用型

public static class Extensions 
{ 
    public static void AddWithSession<T>(this List<T> list, T value, string key) 
    { 
     list.Add(value); 
     HttpContext.Current.Session[key] = list; 
    } 
} 

str.AddWithSession(accordion.ID,SessionKeys.QueryFillOrder); 
0

使用的所有會話變量一個類通過@ M4N的建議是一個好主意,但它很可能成爲一個「神」級(以這種情況下你可以分成幾個以這種方式實現的類)。

但是你可以只改變你的財產implemetation如下:

public List<string> FillOrder 
{  
    get 
    { 
     List<string> result = Session[SessionKeys.QueryFillOrder] as List<string>; 
     if (result == null) 
     { 
      result = new List<string>(); 
      Session[SessionKeys.QueryFillOrder] = result; 
     } 
     return result; 
    }  
    set { Session[SessionKeys.QueryFillOrder] = value; } 
} 

在這個例子中,你可能不希望一個二傳手。

+0

是的,這可能是另一種方式,但我更喜歡M4N的方法!:)無論如何,謝謝! – Alessandro 2011-12-21 09:54:26