сессии со строгим контролем типов в asp.net

Простите мне, если этот вопрос уже задали. HttpContext.Current.Session["key"] возвращает объект, и мы должны были бы бросить его к той детали Type прежде чем мы могли использовать его. Я смотрел на различные реализации введенных сессий

http://www.codeproject.com/KB/aspnet/typedsessionstate.aspx http://weblogs.asp.net/cstewart/archive/2008/01/09/strongly-typed-session-in-asp-net.aspx http://geekswithblogs.net/dlussier/archive/2007/12/24/117961.aspx

и я чувствовал, что мы должны были добавить, еще некоторый код (исправьте меня, если я был неправ) к SessionManager, если мы хотели добавить новое Type из объекта в сессию, или как метод или как отдельная обертка. Я думал, что мы могли использовать дженерики

public static class SessionManager where T:class
 {
  public void SetSession(string key,object objToStore)
  {
   HttpContext.Current.Session[key] = objToStore;
  }

  public T GetSession(string key)
  {
   return HttpContext.Current.Session[key] as T;
  }

 }
  • Есть ли любое свойственное преимущество в использовании

    SessionManager.GetSession("sessionString")

чем использование

HttpContext.Current.Session["sessionString"] as ClassType
  • Я также думал, что будет хорошо иметь что-то как

SessionManager["sessionString"] = objToStoreInSession, но найденный, что статический класс не может иметь индексатора. Там какой-либо другой путь состоит в том, чтобы достигнуть этого?

  • Моя мысль была, создают SessionObject, который сохранил бы Type и объект, затем добавьте этот объект к Сессии (использующий SessionManager) с ключом. При получении, бросает все объекты к SessionObject , доберитесь тип (скажите, что t) и Объект (говорят, что obj), и бросают obj как t и возвратите его.

    public class SessionObject { public Type type {get;set;} public Object obj{get;set;}
    }

это не работало бы также (поскольку подпись возврата будет тем же, но типы возврата будут отличаться).

Есть ли любой другой изящный способ сохранить/получить объекты на сессии более безопасным с точки зрения типов способом

6
задан ram 9 January 2010 в 22:02
поделиться

3 ответа

Для получения очень чистой, удобной в обслуживании и гладкой информации о сессии посмотрите на этот пост . Вы будете удивлены, насколько простым он может быть.

4
ответ дан 10 December 2019 в 02:48
поделиться

Нижняя часть техники заключается в том, что потребляющий код должен знать, какие ключи использовать для хранения и поиска. Это может быть подвержена ошибкам, поскольку ключ должен быть точно правильным, или вы рискуете хранить в неправильном месте или вернуть нулевое значение.

Я фактически использую сильное изменение, поскольку я знаю, что мне нужно иметь на сеансе, и, таким образом, может создать класс упаковки в соответствии с. У меня скорее есть дополнительный код в классе сеанса, и не нужно беспокоиться о ключевых строках где угодно.

2
ответ дан 10 December 2019 в 02:48
поделиться

На самом деле, если вы искали на тип объектов, поместите тип на уровне метода, как:

public T GetValue<T>(string sessionKey)
{

}

Уровень класса больше, если у вас есть тот же объект в сеансе, но сеанс может расширяться несколько типов. Я не знаю, что я буду беспокоиться о контроле заседания; Я бы просто позволил ему делать то, что он на некоторое время сделано, и просто предоставьте средства для извлечения и сохранения информации в более сильно набранном моде (по крайней мере, к потребителю).

Да, индексы не будут работать; Вместо этого вы можете создать его в качестве экземпляра и сделать его статическим путем:

public class SessionManager
{
    private static SessionManager _instance = null;


    public static SessionManager Create()
    {
       if (_instance != null)
           return _instance;

       //Should use a lock when creating the instance
       //create object for _instance

       return _instance;
    }

    public object this[string key] { get { .. } }
}

, и поэтому это статическая реализация завода, но она также поддерживает единую точку контакта с помощью статической ссылки на класс менеджера сеанса. Каждый метод SessionManager может обернуть существующую сеанс ASP.NET или использовать собственное внутреннее хранилище.

1
ответ дан 10 December 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: