您的位置:首页 > 编程语言 > ASP

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

2008-04-12 15:54 411 查看
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




    

{




    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




    /**//// 


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






    private: GetValueOrDefault( eKeys eKey, Object oDefaultValue )#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




    private: GetMandatoryValue( eKeys eKey )#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




    private: GetValue( eKeys eKey )#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






    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)




    /**//// 


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


    }


    }


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: