Эта статья из CodeProject меня очень вдохновила.
http://www.codeproject.com/useritems/SessionWrapper.asp#xx1208856xx .
Как сказал автор, мы часто используем в ASP.NET много кода, подобного следующему, для обнаружения объектов, хранящихся в сеансе, и предотвращения потери переменных, хранящихся после истечения срока действия сеанса:
Int32 nUserID = -1;
if ( null != Session["userID"]) {
if (Session["userID"] — Int32) {
if ( 0 < Session["userID"]) {
nUserID = (Int32) Сеанс["userID"]
}
}
}
если ( -1 == nUserID )
{
throw new ApplicationException («Непредвиденная ситуация: неверный идентификатор пользователя.»);
}
this.doSomething(nUserID);
Такой код будет повсюду.
Таким образом, использование его решения по инкапсуляции для рефакторинга действительно делает код намного проще и чище!
После инкапсуляции приведенному выше коду требуется только одно предложение:
this.doSomething( CCurrentSession.UserID).
Его класс на самом деле очень простой, как показано ниже:
использование системы;
с помощью System.Web
/**////-------------------------------------- -- ----------------------------------
/// Разработано М. ван Эйкелем – август 2005 г.
/// [e]: [email protected]
/// [w] :
пространство имен www.vaneijkel.com VanEijkel.Web
{
/**//// <сводка>
/// Класс-оболочка для объекта сеанса.
/// Он централизует логику получения и проверки информации о сеансе.
/// Используя такой подход, вы улучшаете защиту и инкапсуляцию существующего кода.
/// Он предлагает простой, легкий в управлении способ улучшения существующего веб-приложения с низким уровнем риска.
/// Поэтому я называю это веб-рефакторингом.
/// </сводка>
открытый класс CurrentSession
{
Константы#регион Константы
Private const String sMANDATORY_SESSION_KEY_NOT_FOUND_MSG = "Переменная сеанса исключена, но не существует. Key={0}";
Private const String sMANDATORY_SESSION_VALUE_INVALID_NULL = "Нет нулевых значений сеанса. Key={0}"
;
частная константа Int32 nUSERID_MINIMUM = 1;
Private const String sUSERID_INVALID = "Неверный UserID:{0}. UserID должен быть больше:{1}";
#endregion
UserID#region UserID
/**//// <сводка>
/// Возвращает userID как Int32 вместо объекта.
/// Таким образом вы получите необходимую защиту компилятора и интеллектуальную поддержку.
/// </сводка>
общедоступный статический идентификатор пользователя Int32
{
получать
{
return (Int32) GetValueOrDefault(eKeys.UserID, nUSERID_UNKOWN);
}
набор
{
если (nUSERID_MINIMUM >= значение)
{
выдать новое исключение ApplicationException ( String.Format(sUSERID_INVALID, value, nUSERID_MINIMUM));
}
SetValue(eKeys.UserID, значение);
}
}
#endregion
Private: GetValueOrDefault( eKeys eKey, Object oDefaultValue ) #region Private: GetValueOrDefault( eKeys eKey, Object oDefaultValue )
/**//// <сводка>
/// Получает значение из объекта сеанса.
/// </сводка>
/// <param name="eKey"> Ключ сеанса, для которого нужно получить значение.</param>
/// <param name="oDefaultValue">Значение по умолчанию, которое будет использоваться, если допустимое значение не сохранено.</param>
/// <returns>Когда значение равно нулю или ключ не существует,
/// возвращается указанное значение по умолчанию.
/// В противном случае возвращается значение</returns>
частный статический объект GetValueOrDefault(eKeys eKey, Object oDefaultValue)
{
// получаем значение
объект oValue = GetValue(eKey);
//значение не найдено или равно нулю?
если (ноль == oValue)
{
//возвращаем значение по умолчанию
вернуть значение по умолчанию;
}
//все ОК: возвращаем значение сеанса
вернуть означение;
}
#конечныйрегион
Private: GetMandatoryValue( eKeys eKey )#region Private: GetMandatoryValue( eKeys eKey )
/**//// <сводка>
/// Возвращает значение сеанса для сеансового ключа, который должен существовать.
/// Если ключ не существует, генерируется исключение applicationException.
/// </сводка>
/// <param name="eKey"> Ключ сеанса, для которого возвращается значение сеанса </param>.
/// <returns> Значение, отличное от NULL.</returns>
частный статический объект GetMandatoryValue(eKeys eKey)
{
// получаем значение
object oValue = GetValue(eKey);
//ключ не найден или значение равно нулю?
если (нуль == oValue)
{
//выдаем исключение applicationException, поскольку это логическая ошибка приложения (нет CLR)
выдать новое исключение ApplicationException ( String.Format( sMANDATORY_SESSION_KEY_NOT_FOUND_MSG, eKey.ToString() ));
}
//все ОК: возвращаемое значение
вернуть означение;
}
#конечныйрегион
Private: GetValue( eKeys eKey )#region Private: GetValue( eKeys eKey )
/**//// <сводка>
/// Получает значение сеанса по указанному ключу.
/// </сводка>
/// <param name="eKey">Ключ, из которого нужно получить значение</param>
/// <returns>Значение сеанса для указанного сеансового ключа.
/// Если ключ не существует, возвращается ноль.
/// </возвращается>
частный статический объект GetValue(eKeys eKey)
{
return HttpContext.Current.Items[eKey.ToString()];
}
#endregion
Private SetMandatoryValue( eKeys eKey, Object oValue )#region Private SetMandatoryValue( eKeys eKey, Object oValue )
Private static void SetMandatoryValue(eKeys eKey, Object oValue)
{
если (нуль == oValue)
{
выдать новое исключение ApplicationException( String.Format(sMANDATORY_SESSION_VALUE_INVALID_NULL, eKey.ToString() ));
}
}
#конечныйрегион
Private SetValue( eKeys eKey, Object oValue)#region Private SetValue( eKeys eKey, Object oValue)
/**//// <сводка>
/// Сохраняет указанное значение сеанса в указанном ключе сеанса.
/// </сводка>
/// <param name="eKey">Ключ для значения, сохраняемого в сеансе.</param>
/// <param name="oValue">Значение, которое нужно сохранить в сеансе</param>
Private static void SetValue (eKeys eKey, Object oValue)
{
HttpContext.Current.Items[eKey.ToString()] = oValue;
}
#endregion
/**//// <сводка>
/// Перечисление для
/// </сводка>
частное перечисление eKeys
{
ID пользователя
}
}
}