现在的位置: 首页 > 综合 > 正文

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

2012年05月06日 ⁄ 综合 ⁄ 共 5516字 ⁄ 字号 评论关闭

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
    
{
    
#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
    
/// <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


    
#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

    
#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

    
#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


    
#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)
    
/// <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
    }

    }

}

抱歉!评论已关闭.