程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 重構Session確實讓代碼簡潔干淨了不少

重構Session確實讓代碼簡潔干淨了不少

編輯:.NET實例教程


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]: [email protected]
/// [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
      {
     &n
bsp;  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 appl
icationException 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
    }
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved