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.comnamespace 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 } }}