簡體   English   中英

管理會話數據的更好方法

[英]Better way to manage Session data

我需要在Session中保留一些數據。 我寫了很多這樣的屬性:

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);

但這樣我的價值就不會保存在Session中。

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

非常感謝你!

我總是在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>
  • 它可以幫助您避免大量的類型轉換
  • 您不必在整個應用程序中使用硬編碼會話密鑰(例如Session [“loginId”]
  • 您可以通過在MySession的屬性上添加XML doc注釋來記錄會話項

您也可以使用擴展方法,但我認為M4N的示例可能更好:

EDIT使它成為通用類型

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);

您可以編寫一個實現ICollection或IList的自己的類,在那里您將實現Add as Session [...] = ...

對@ M4N建議的所有Session變量使用單個類是一個好主意,雖然它有可能成為“上帝”類(在這種情況下,你可以分成幾個以這種方式實現的類)。

但是,您可以按如下方式更改屬性實現:

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; } 
} 

在此示例中,您可能不需要setter。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM