Artikel dari CodeProject ini sangat menginspirasi saya,
http://www.codeproject.com/useritems/SessionWrapper.asp#xx1208856xx .
Seperti yang penulis katakan, kita sering menggunakan banyak kode yang mirip dengan berikut ini di ASP.NET untuk mendeteksi objek yang disimpan dalam Sesi untuk mencegah hilangnya variabel yang disimpan setelah Sesi berakhir:
Int32 nUserID = -1;
jika ( null != Sesi["ID pengguna"] ) {
if (Sesi["userID"] adalah Int32) {
jika ( 0 < Sesi["ID pengguna"] ) {
nUserID = (Int32) Sesi["userID"]
}
}
}
jika ( -1 == nUserID )
{
throw new ApplicationException ( "Situasi tak terduga: ID pengguna tidak valid." );
}
ini.melakukan Sesuatu( nUserID );
Kode seperti ini akan ada dimana-mana.
Jadi, menggunakan solusi enkapsulasi untuk pemfaktoran ulang benar-benar membuat kode menjadi lebih sederhana dan bersih!
Setelah dienkapsulasi, kode di atas hanya membutuhkan satu kalimat:
this.doSomething( CCurrentSession.UserID )
Kelasnya sebenarnya sangat sederhana, seperti gambar di bawah ini:
menggunakan Sistem;
menggunakan Sistem.Web;
/**////-------------------------------------- -- ----------------------------------
/// Dikembangkan oleh M. van Eijkel - Agustus 2005
/// [e]: [email protected]
/// [w]: www.vaneijkel.com
ruang nama VanEijkel.Web
{
/**//// <ringkasan>
/// Kelas pembungkus untuk objek sesi.
/// Ini memusatkan logika untuk mengambil dan memvalidasi informasi sesi.
/// Dengan menggunakan pendekatan seperti ini Anda meningkatkan perlindungan dan enkapsulasi kode yang ada.
/// Ini menawarkan cara sederhana, berisiko rendah, dan mudah dikelola untuk meningkatkan Aplikasi Web yang ada.
/// Oleh karena itu, saya menyebutnya webRefactoring.
/// </ringkasan>
Sesi Saat Ini kelas publik
{
Konstanta#Konstanta wilayah
private const String sMANDATORY_SESSION_KEY_NOT_FOUND_MSG = "Variabel sesi dikecualikan tetapi tidak ada. Kunci={0}";
private const String sMANDATORY_SESSION_VALUE_INVALID_NULL = "Tidak ada nilai sesi null yang dikecualikan. Kunci={0}";
private const Int32 nUSERID_UNKOWN = -1;
pribadi const Int32 nUSERID_MINIMUM = 1;
private const String sUSERID_INVALID = "ID Pengguna tidak valid:{0}. ID Pengguna harus lebih besar dari:{1}";
wilayah akhir
#ID Pengguna wilayah
/**//// <ringkasan>
/// Mengembalikan ID pengguna sebagai Int32, bukan objek.
/// Dengan cara ini Anda akan mendapatkan perlindungan kompiler dan dukungan intelijen yang Anda perlukan.
/// </ringkasan>
ID Pengguna Int32 statis publik
{
mendapatkan
{
kembali (Int32) GetValueOrDefault( eKeys.UserID, nUSERID_UNKOWN );
}
mengatur
{
jika ( nUSERID_MINIMUM >= nilai )
{
melempar ApplicationException baru ( String.Format(sUSERID_INVALID, value, nUSERID_MINIMUM ));
}
SetValue(eKeys.UserID, nilai);
}
}
#endregion
pribadi: GetValueOrDefault( eKeys eKey, Object oDefaultValue ) #region private: GetValueOrDefault( eKeys eKey, Object oDefaultValue )
/**//// <ringkasan>
/// Mendapatkan nilai dari objek sesi.
/// </ringkasan>
/// <param name="eKey"> Kunci sesi untuk mendapatkan nilainya.</param>
/// <param name="oDefaultValue">Nilai default yang digunakan jika tidak ada nilai valid yang disimpan.</param>
/// <returns>Ketika nilainya null atau kuncinya tidak ada,
/// nilai default yang ditentukan dikembalikan.
/// Jika tidak, nilai akan dikembalikan</returns>
objek statis pribadi GetValueOrDefault( eKeys eKey, Objek oDefaultValue )
{
//dapatkan nilainya
objek oValue = GetValue( eKey );
//nilai tidak ditemukan atau nol?
jika (null == oNilai)
{
//mengembalikan nilai default
kembalikan oDefaultValue;
}
//semuanya OK: mengembalikan nilai sesi
kembalikan nilai;
}
#wilayah akhir
pribadi: GetMandatoryValue( eKeys eKey )#wilayah pribadi: GetMandatoryValue( eKeys eKey )
/**//// <ringkasan>
/// Mengembalikan nilai sesi untuk kunci sesi yang harus ada.
/// Jika kunci tidak ada, applicationException akan dilemparkan.
/// </ringkasan>
/// <param name="eKey"> Kunci sesi untuk mengembalikan nilai sesi </param>
/// <returns> Nilai yang tidak ada nolnya.</returns>
objek statis pribadi GetMandatoryValue( eKeys eKey )
{
//dapatkan nilainya
objek oValue = GetValue( eKey );
//kunci tidak ditemukan atau bernilai nol?
jika(null==oNilai)
{
//lempar applicationException karena logika aplikasinya error (tidak ada CLR)
melempar ApplicationException baru ( String.Format( sMANDATORY_SESSION_KEY_NOT_FOUND_MSG, eKey.ToString() ));
}
//semuanya OK: mengembalikan nilai
kembalikan nilai;
}
#wilayah akhir
pribadi: GetValue( eKeys eKey )#wilayah pribadi: GetValue( eKeys eKey )
/**//// <ringkasan>
/// Mendapatkan nilai sesi dari kunci yang ditentukan.
/// </ringkasan>
/// <param name="eKey">Kunci untuk mendapatkan nilai dari</param>
/// <returns>Nilai sesi untuk kunci sesi yang ditentukan.
/// Jika kunci tidak ada, null dikembalikan.
/// </pengembalian>
objek statis pribadi 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 )
{
jika(null==oNilai)
{
melempar ApplicationException baru( String.Format(sMANDATORY_SESSION_VALUE_INVALID_NULL, eKey.ToString() ) );
}
}
#wilayah akhir
SetValue pribadi( eKeys eKey, Objek oValue)#wilayah SetValue pribadi( eKeys eKey, Objek oValue)
/**//// <ringkasan>
/// Menyimpan nilai sesi yang ditentukan ke kunci sesi yang ditentukan.
/// </ringkasan>
/// <param name="eKey">Kunci untuk menyimpan nilai dalam sesi.</param>
/// <param name="oValue">Nilai yang akan disimpan dalam sesi</param>
private static void SetValue (eKeys eKey, Object oValue)
{
HttpContext.Current.Items[eKey.ToString()] = oValue;
}
#wilayah akhir
/**//// <ringkasan>
/// Sebuah enum untuk
/// </ringkasan>
eKey enum pribadi
{
ID Pengguna
}
}
}