Простите мне, если этот вопрос уже задали. 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
чем использование
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;}
}
это не работало бы также (поскольку подпись возврата будет тем же, но типы возврата будут отличаться).
Есть ли любой другой изящный способ сохранить/получить объекты на сессии более безопасным с точки зрения типов способом
Для получения очень чистой, удобной в обслуживании и гладкой информации о сессии посмотрите на этот пост . Вы будете удивлены, насколько простым он может быть.
Нижняя часть техники заключается в том, что потребляющий код должен знать, какие ключи использовать для хранения и поиска. Это может быть подвержена ошибкам, поскольку ключ должен быть точно правильным, или вы рискуете хранить в неправильном месте или вернуть нулевое значение.
Я фактически использую сильное изменение, поскольку я знаю, что мне нужно иметь на сеансе, и, таким образом, может создать класс упаковки в соответствии с. У меня скорее есть дополнительный код в классе сеанса, и не нужно беспокоиться о ключевых строках где угодно.
На самом деле, если вы искали на тип объектов, поместите тип на уровне метода, как:
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 или использовать собственное внутреннее хранилище.