• [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
        
    {
        
    #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
        }

        }

    }

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/zhengyun_ustc/p/227316.html
Copyright © 2020-2023  润新知