[ASP.NET]重构Session确实让代码简洁干净了不少

news/2024/5/17 17:05:59

CodeProject的这篇文章确实对我有所启迪,
http://www.codeproject.com/useritems/SessionWrapper.asp#xx1208856xx。

诚如作者所说,我们经常在ASP.NET用许多类似于下面的代码来检测Session中存储的对象,来防止Session过期后存储的变量丢失问题:
Int32 nUserID = -1;
if ( null != Session["userID"] ) {
  if ( Session["userID"] is Int32 ) {
    if ( 0 < Session["userID"] ) {
      nUserID = (Int32) Session["userID"]
    }
  }
}
if ( -1 == nUserID )
{
  throw new ApplicationException ( "Unexpected situation: userID invalid." );
}

this.doSomething( nUserID );
这样的代码会遍布各处。

那么,利用他的这个封装方案来做重构,确实让代码简洁干净了不少!
经过他的封装,上面的代码用这么一句话就行了:

this.doSomething( CCurrentSession.UserID )

他的类其实也很简单,如下所示:

using  System;
using  System.Web;

///--------------------------------------------------------------------
/// Developed by M. van Eijkel - aug 2005 
/// [e]: marcelvaneijkel@gmail.com
/// [w]: www.vaneijkel.com


namespace  VanEijkel.Web
{
    
/// 
    
/// Wrapper class for the session object.
    
/// It centralizes the logic for retrieving and validation of session information.
    
/// By using an approach like this you improve the protection and encapsulation of existing code.
    
/// It offers a simple, low-risk, easy manageable way to improve existing WebApplication.
    
/// Therfore, I call it webRefactoring.
    
/// 

    public class CurrentSession
    
{
    
#region Constants
    
private const String sMANDATORY_SESSION_KEY_NOT_FOUND_MSG = "Session variable excepted but does not exist. Key={0}";
    
private const String sMANDATORY_SESSION_VALUE_INVALID_NULL = "None null session value excepted. Key={0}";

    
private const Int32 nUSERID_UNKOWN = -1;
    
private const Int32 nUSERID_MINIMUM = 1;
    
private const String sUSERID_INVALID = "Invalid UserID:{0}. UserID should be larger than:{1}";
    
#endregion


    
#region UserID
    
/// 
    
/// Returns the userID as a Int32 instead of an object.
    
/// This way you will get the compiler protection and intelligence support you need.
    
/// 

    public static Int32 UserID
    
{
      
get 
      
{
        
return (Int32) GetValueOrDefault( eKeys.UserID, nUSERID_UNKOWN );
      }

      
set
      
{
        
if ( nUSERID_MINIMUM >= value )
        
{
          
throw new ApplicationException ( String.Format(sUSERID_INVALID, value, nUSERID_MINIMUM ));
        }

        SetValue( eKeys.UserID, value );
      }

    }

    
#endregion


    
#region private: GetValueOrDefault( eKeys eKey, Object oDefaultValue )
    
/// 
    
/// Gets the value from the session object.
    
/// 

    
///   The session key to get the value for.
    
///  The default value to use if no valid value stored.
    
///  When the value is null or the key does not exist, 
    
/// the specified default value is returned. 
    
/// Otherwise, the value is returned

    private static object GetValueOrDefault( eKeys eKey, Object oDefaultValue )
    
{
      
//get the value
      object oValue = GetValue( eKey );

      
//value not found or null?
      if (null == oValue)
      
{
        
//return default value
        return oDefaultValue;
      }


      
//everything oke: return session value
      return oValue;
    }

    
#endregion

    
#region private: GetMandatoryValue( eKeys eKey )
    
/// 
    
/// Returns the session value for a session-key that must exist.
    
/// If the key does not exist an applicationException is thrown.
    
/// 

    
///   The session-key to return the session-value for. 
    
///   A none-null value.

    private static object GetMandatoryValue( eKeys eKey )
    
{
      
//get the value
      object oValue = GetValue( eKey );

      
//key not found or value null?
      if ( null == oValue )
      
{
        
//throw applicationException because its application logic error (none CLR)
        throw new ApplicationException ( String.Format( sMANDATORY_SESSION_KEY_NOT_FOUND_MSG, eKey.ToString() ));
      }


      
//everything oke: return value
      return oValue;
    }

    
#endregion

    
#region private: GetValue( eKeys eKey )
    
/// 
    
/// Gets the session value from the specified key.
    
/// 

    
///  The key to get the value from
    
///  The session value for the specified session key.
    
/// If the key does not exist, null is returned.
    
/// 

    private static object GetValue( eKeys eKey )
    
{
      
return HttpContext.Current.Items[ eKey.ToString() ];
    }

    
#endregion


    
#region private SetMandatoryValue( eKeys eKey, Object oValue )
    
private static void SetMandatoryValue( eKeys eKey, Object oValue )
    
{
      
if ( null == oValue ) 
      
{
        
throw new ApplicationException(  String.Format(sMANDATORY_SESSION_VALUE_INVALID_NULL, eKey.ToString() ) );
      }

    }

    
#endregion

    
#region private SetValue( eKeys eKey, Object oValue)
    
/// 
    
/// Stores the specified session-value to the specified session-key.
    
/// 

    
///  The key for the value to store in the session.
    
///  The value to store in the session

    private static void SetValue ( eKeys eKey, Object oValue)
    
{
      HttpContext.Current.Items[eKey.ToString()] 
= oValue;
    }

    
#endregion


    
/// 
    
/// An enum for the 
    
/// 

    private enum eKeys
    
{
      UserID
    }

    }

}





http://www.niftyadmin.cn/n/3649568.html

相关文章

redis修改配置重启命令_如何从命令行更改Redis的配置

redis修改配置重启命令介绍 (Introduction) Redis is an open-source, in-memory key-value data store. Redis has several commands that allow you to make changes to the Redis server’s configuration settings on the fly. This tutorial will go over some of these c…

SSH连接工具FinalShell的安装与使用

常见的SSH连接工具有好多&#xff0c;我以前常用的是xshellxftp组合。虽然需要付费&#xff0c;但是免费版已经基本满足我的需求。关于xshell和xftp的安装和使用可以参考我以前的博客&#xff1a;Xftp和Xshelll的安装—远程连接linux FinalShell是一体化的的服务器,网络管理软件…

[j2me]利用kSOAP让MIDP设备与WebService之间传递类对象

[j2me]利用kSOAP让MIDP设备与WebService之间传递类对象编写者日期关键词郑昀ultrapower2005-8-14J2me webservice soa ksoap serialization MIDP CLDC中国移动GPRS网络的连接方式有两种类型&#xff0c;一种是WAP&#xff0b;GPRS&#xff0c;接入名称叫CMWAP&#xff0c;一种是…

盖茨比乔布斯_盖茨比中的自定义字体

盖茨比乔布斯Choosing the right font can add great value to a site and enhance the user experience. The right font-loading strategy, however, can be somewhat of a challenge. That’s why Gatsby provides several developer-friendly solutions for all of our fon…

Android中GridView使用

GridView(网格视图)是按照行列的方式来显示内容的&#xff0c;一般用于显示图片&#xff0c;图片等内容&#xff0c;比如实现九宫格图&#xff0c;用GridView是首选&#xff0c;也是最简单的。主要用于设置Adapter。 GridView常用的XML属性&#xff1a; 属性名称 描述 an…

旧版Chrome浏览器的安装和使用——chrome63

虽然新版的Chrome浏览器很好用&#xff0c;但是界面风格我还是喜欢旧版的浏览器。我的电脑上有新版和旧版两个。不过正常情况下谷歌浏览器只能安装一个。我的做法是新版的浏览器正常安装&#xff0c;旧版的有点类似eclipse&#xff0c;解压就可以使用。不过使用前面需要解决一个…

javascript 引擎_V8引擎和JavaScript优化技巧

javascript 引擎V8 is Google’s engine for compiling our JavaScript. Firefox has it’s own engine called SpiderMonkey, it’s quite similar to V8 but there are differences. We will be discussing the V8 engine in this article. V8是Google用来编译JavaScript的引…

Widget的基本知识与历史渊源

一、Widget是什么&#xff1f; App Widget是应用程序窗口小部件&#xff08;Widget&#xff09;是微型的应用程序视图&#xff0c;它可以被嵌入到其它应用程序中&#xff08;比如桌面&#xff09;并接收周期性的更新。你可以通过一个App Widget Provider来发布一个Widget。…