строго типизированные сессии в asp.net - PullRequest
6 голосов
/ 10 января 2010

Простите, если этот вопрос уже задавался. 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<T> 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<ClassType>.GetSession("sessionString")

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

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

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 10 января 2010

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

2 голосов
/ 26 марта 2011

Вы можете просто использовать шаблон синглтона для вашего объекта сеанса. Таким образом, вы можете смоделировать весь ваш сеанс из одного объекта составной структуры. Этот пост относится к тому, о чем я говорю, и обсуждает объект Session как слабо типизированный объект: http://allthingscs.blogspot.com/2011/03/documenting-software-architectural.html

2 голосов
/ 11 января 2010

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

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

1 голос
/ 10 января 2010

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

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 или использовать собственное внутреннее хранилище.

0 голосов
/ 19 марта 2015

Я разместил решение по вопросу StackOverflow это хорошая идея, чтобы создать перечисление для имен ключей значений сеанса?

Я думаю, что это действительно гладко и содержит очень мало кода, чтобы это произошло. Он нуждается в .NET 4.5, чтобы быть самым привлекательным, но все же возможно с более старыми версиями.

Позволяет:

int myInt = SessionVars.MyInt; 
SessionVars.MyInt = 3;

работать так же, как:

int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;
...