CodeProject のこの記事は本当に私にインスピレーションを与えてくれました。
http://www.codeproject.com/useritems/SessionWrapper.asp#xx1208856xx 。
著者が述べたように、セッションの有効期限が切れた後に保存されている変数の損失を防ぐために、セッションに保存されているオブジェクトを検出するために、ASP.NET では次のようなコードを多く使用します。
Int32 nUserID = -1;
if ( null != セッション["ユーザーID"] ) {
if (セッション["userID"] が Int32) {
if ( 0 < セッション["ユーザーID"] ) {
nUserID = (Int32) セッション["ユーザーID"]
}
}
}
if ( -1 == nUserID )
{
throw new ApplicationException ( "予期しない状況: userID が無効です。" );
this.doSomething
( nUserID );
このようなコードはどこにでもあります。
したがって、彼のカプセル化ソリューションをリファクタリングに使用すると、コードがはるかにシンプルかつクリーンになります。
カプセル化後、上記のコードに必要なのは 1 つの文だけです:
this.doSomething( CCurrentSession.UserID )
このクラスは、以下に示すように、実際には非常に単純です。
システムを使用する;
System.Web を使用します。
/**////-------------------------------------- -- ----------------------------------
/// M. van Eijkel によって開発 - 2005 年 8 月
/// [電子]: [email protected]
/// [w]: www.vaneijkel.com
名前空間 VanEijkel.Web
{
/**//// <概要>
/// セッション オブジェクトのラッパー クラス。
/// セッション情報の取得と検証のロジックを一元化します。
/// このようなアプローチを使用すると、既存のコードの保護とカプセル化が向上します。
/// 既存の Web アプリケーションを改善するための、シンプルでリスクが低く、管理しやすい方法を提供します。
/// したがって、私はこれを webRefactoring と呼びます。
/// </概要>
パブリック クラス CurrentSession
{
定数#region 定数
private const String sMANDATORY_SESSION_KEY_NOT_FOUND_MSG = "セッション変数は例外になりましたが、存在しません。Key={0}";
private const String sMANDATORY_SESSION_VALUE_INVALID_NULL = "null セッション値は例外です。Key={0}";
private const Int32 nUSERID_UNKOWN = -1;
プライベート const Int32 nUSERID_MINIMUM = 1;
private const String sUSERID_INVALID = "無効なユーザー ID:{0}。ユーザー ID は {1} より大きい必要があります。";
#endregion
ユーザー ID#region ユーザー ID
/**//// <概要>
/// userID をオブジェクトではなく Int32 として返します。
/// これにより、必要なコンパイラ保護とインテリジェンス サポートが得られます。
/// </概要>
パブリック静的 Int32 ユーザー ID
{
得る
{
return (Int32) GetValueOrDefault( eKeys.UserID, nUSERID_UNKOWN );
}
セット
{
if ( nUSERID_MINIMUM >= 値 )
{
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 )
/**//// <概要>
/// セッション オブジェクトから値を取得します。
/// </概要>
/// <param name="eKey"> 値を取得するセッション キー。</param>
/// <param name="oDefaultValue">有効な値が保存されていない場合に使用するデフォルト値。</param>
/// <returns>値が null またはキーが存在しない場合、
/// 指定されたデフォルト値が返されます。
/// それ以外の場合は値が返されます</returns>
プライベート静的オブジェクト GetValueOrDefault( eKeys eKey, Object oDefaultValue )
{
//値を取得する
object oValue = GetValue( eKey );
//値が見つからない、または null?
if (null == oValue)
{
//デフォルト値を返す
oDefaultValue を返します。
}
//すべてOK: セッション値を返す
oValue を返します。
}
#エンドリージョン
プライベート: GetMandatoryValue( eKeys eKey )#region プライベート: GetMandatoryValue( eKeys eKey )
/**//// <概要>
/// 存在する必要があるセッションキーのセッション値を返します。
/// キーが存在しない場合は、applicationException がスローされます。
/// </概要>
/// <param name="eKey"> セッション値を返すセッションキー </param>
/// <returns> null 以外の値。</returns>
プライベート静的オブジェクト GetMandatoryValue( eKeys eKey )
{
//値を取得する
object oValue = GetValue( eKey );
//キーが見つからないか、値が null ですか?
if(null==oValue)
{
// アプリケーション ロジック エラー (CLR なし) のため、applicationException をスローします
throw new ApplicationException ( String.Format( sMANDATORY_SESSION_KEY_NOT_FOUND_MSG, eKey.ToString() ));
}
//すべてOK: 戻り値
oValue を返します。
}
#エンドリージョン
プライベート: GetValue( eKeys eKey )#region プライベート: GetValue( eKeys eKey )
/**//// <概要>
/// 指定されたキーからセッション値を取得します。
/// </概要>
/// <param name="eKey">値を取得するキー</param>
/// <returns>指定されたセッション キーのセッション値。
/// キーが存在しない場合は null が返されます。
/// </リターン>
プライベート静的オブジェクト 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() ) );
}
}
#エンドリージョン
private SetValue( eKeys eKey, Object oValue)#region private SetValue( eKeys eKey, Object oValue)
/**//// <概要>
/// 指定されたセッション値を指定されたセッションキーに保存します。
/// </概要>
/// <param name="eKey">セッションに保存する値のキー。</param>
/// <param name="oValue">セッションに保存する値</param>
private static void SetValue (eKeys eKey、Object oValue)
{
HttpContext.Current.Items[eKey.ToString()] = oValue;
}
#endregion
/**//// <概要>
/// の列挙型
/// </概要>
プライベート列挙型 eKey
{
ユーザーID
}
}
}