WEB开发网
开发学院WEB开发ASP.NET 重构Session确实让代码简洁干净了不少 阅读

重构Session确实让代码简洁干净了不少

 2005-09-07 17:00:39 来源:WEB开发网   
核心提示:CodePRoject的这篇文章确实对我有所启迪,http://www.codeproject.com/useritems/sessionWrapper.asp#xx1208856xx,重构Session确实让代码简洁干净了不少,诚如作者所说,我们经常在asp.net用许多类似于下面的代码来检测Session中存储的对

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="oDefaultValue">The default value to use if no valid value stored.</param>
   /// <returns>When the value is null or the key does not exist,
   /// the specified default value is returned.
   /// Otherwise, the value is returned</returns>
   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
   private: GetMandatoryValue( eKeys eKey )#region private: GetMandatoryValue( eKeys eKey )
   /**//// <summary>
   /// Returns the session value for a session-key that must exist.
   /// If the key does not exist an applicationException is thrown.
   /// </summary>
   /// <param name="eKey"> The session-key to return the session-value for. </param>
   /// <returns> A none-null value.</returns>
   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
   private: GetValue( eKeys eKey )#region private: GetValue( eKeys eKey )
   /**//// <summary>
   /// Gets the session value from the specified key.
   /// </summary>
   /// <param name="eKey">The key to get the value from</param>
   /// <returns>The session value for the specified session key.
   /// If the key does not exist, null is returned.
   /// </returns>
   private static object 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 )
   {
    if ( null == oValue )
    {
     throw new ApplicationException(  String.Format(sMANDATORY_SESSION_VALUE_INVALID_NULL, eKey.ToString() ) );
    }
   }
   #endregion
   private SetValue( eKeys eKey, Object oValue)#region private SetValue( eKeys eKey, Object oValue)
   /**//// <summary>
   /// Stores the specified session-value to the specified session-key.
   /// </summary>
   /// <param name="eKey">The key for the value to store in the session.</param>
   /// <param name="oValue">The value to store in the session</param>
   private static void SetValue ( eKeys eKey, Object oValue)
   {
    HttpContext.Current.Items[eKey.ToString()] = oValue;
   }
   #endregion

   /**//// <summary>
   /// An enum for the
   /// </summary>
   private enum eKeys
   {
    UserID
   }
   }
}

Tags:重构 Session 确实

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接