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

        }

    }

  • 相关阅读:
    ios app: 使用企业license设置发布app的过程
    gtest测试代码编写思想
    受尽侮辱的语言
    创业者的思维误区---《精益创业》
    session的取代者:Json Web Tokens----在客户端存储登陆状态
    lineman 的理念与 modern web app
    angularjs框架及其生态环境 --待续
    javascript的崛起及其生态元素
    Cassandra 2.x 提示“错误: 代理抛出异常错误: java.lang.NullPointerException”
    cassandra运行出现了Unable to gossip with any seeds,cqlsh链接不上,提示connection refused处理办法
  • 原文地址:https://www.cnblogs.com/zhengyun_ustc/p/227316.html
Copyright © 2020-2023  润新知