日期:2010-08-07  浏览次数:20487 次

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
  {
   /**//// <summary>
   /// 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.
   /// </summary>
   public class CurrentSession
   {
   Constants#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
  
   UserID#region UserID
   /**//// <summary>
   /// Returns the userID as a Int32 instead of an object.
   /// This way you will get the compiler protection and intelligence support you need.
   /// </summary>
   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
  
   private: GetValueOrDefault( eKeys eKey, Object oDefaultValue )#region private: GetValueOrDefault( eKeys eKey, Object oDefaultValue )
   /**//// <summary>
   /// Gets the value from the session object.
   /// </summary>
   /// <param name="eKey"> The session key to get the value for.</param>
   /// <param name="o