2011-12-21 2 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>)
  • это избавит вас от многих типов литья
  • вы не должны использовать жестко закодированные сеансовые ключи в вашем приложении (например, Session [ «LoginID»]
  • вы можете документировать сессии пунктов путем добавления комментариев XML DOC на свойства MySession
+0

Спасибо за ваш ответ! И, используя этот подход, MySession.Current.FillOrder.Add (accordionID) будет сохраняться автоматически в сеансе? Я не могу понять магию! : D – Alessandro

+0

Да! Когда вы впервые получаете доступ к MySession.Current, новый экземпляр MySession будет создан и сохранен в сеансе ASP.NET.С этого момента вы всегда будете работать с этим экземпляром. Установите точку останова для получателя текущего свойства, чтобы узнать, как он работает. – M4N

+0

Да, ясно, что я всегда работаю с этим экземпляром. То, что я не могу понять, это то, где он сохраняет изменения в сеансе. – Alessandro

0

вы можете написать свой собственный класс, который реализует ICollection или IList, то вы бы реализовать Добавить в сессии [...] = ...

1

вы можете используйте также метод расширения, но я думаю, что пример 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); 
0

Использование одного класса для всех переменных сессии, предложенный @ M4N является хорошей идеей, хотя она рискует превратиться в класс «Бог» (в в этом случае вы могли бы разбить на несколько классов, реализованных таким образом).

Однако можно просто изменить свойство реализации выглядит следующим образом:

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

Смежные вопросы