This article from CodeProject really inspired me,
http://www.codeproject.com/useritems/SessionWrapper.asp#xx1208856xx .
As the author said, we often use a lot of code similar to the following in ASP.NET to detect the objects stored in the Session to prevent the loss of variables stored after the Session expires:
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 );
Code like this will be everywhere.
So, using his encapsulation solution for refactoring really makes the code a lot simpler and cleaner!
After its encapsulation, the above code only needs one sentence:
this.doSomething( CCurrentSession.UserID )
His class is actually very simple, as shown below:
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
{
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 OK: 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 OK: 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
}
}
}