网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.IIS运行不了ASP.NET的解决办法.
..net2.0邮件发送代码.
.asp.net 2.0下一个标准GRIDVIEW功.
.关于线程的参数、“返回值”、及.
..NET 3.x新特性之自动属性及集合.
.如何改变asp.net项目名称.
.一段获得网卡地址的代码,可以用来.
.正则表达式在网页处理中的应用四.
.asp.net技术的学习顺序问题.
.微软发布了ASP.NET MVC源代码.
.Web 2.0时代RSS的.Net实现.
.一个简单的数据操作类.
.ASP.NET 2.0 - Enter Key - Defa.
.ASP.NET技巧:为Blog打造个性日历.
.ACCESS在Web.config里设置连接字.
.ASP.NET 无法确保在注册的 JavaS.
.在 Linux 下运行 ASP.NET 2.0.
.在ASP.NET里得到网站的域名.
.动态创建MSSQL数据库表存储过程.
..net的Membership,为什么就这么.

重构Session确实让代码简洁干净了不少

发表日期:2005-9-7


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
    {
    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
    }
    }
}

上一篇:在Asp.net中为图像加入版权信息 人气:7861
下一篇:JSP与ASP.Net之间的Session值共享 人气:9153
浏览全部asp.net的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐