Asp.net

為會話值的鍵名創建一個列舉是個好主意嗎?

  • March 19, 2015

而不是做

session("myvar1") = something
session("myvar2") = something
session("myvar3") = something
session("myvar4") = something

是在做

enum sessionVar
  myvar1
  myvar2
  myvar3
  myvar4
end enum


session(sessionVar.myvar1.tostring) = something
session(sessionVar.myvar2.tostring) = something
session(sessionVar.myvar3.tostring) = something
session(sessionVar.myvar4.tostring) = something

會更好?

我沒有使用會話密鑰的常量,而是使用我自己的類型安全會話對象,它看起來像這樣(抱歉,這是在 C# 中,請參閱下面的 VB 版本):

public class MySession
{
 // Private constructor (use MySession.Current to access the current instance).
 private MySession() {}

 // Gets the current session.
 public static MySession Current
 {
   get
   {
     MySession session = HttpContext.Current.Session["__MySession__"] as MySession;
     if (session == null)
     {
       session = new MySession();
       HttpContext.Current.Session["__MySession__"] = session;
     }
     return session;
   }
 }

 // My session data goes here:
 public string MyString { get; set; };
 public bool MyFlag { get; set; };
 public int MyNumber { get; set; };
}

每當我需要從會話中讀取/寫入某些內容時,我可以像這樣使用我的類型安全會話對象:

string s = MySession.Current.MyString;
s = "new value";
MySession.Current.MyString = s;

該解決方案具有幾個優點:

  • 我有一個類型安全的會話(不再有類型轉換)
  • 我可以記錄所有基於會話的數據(通過評論 MySession 中的公共屬性)
  • 向會話中添加新元素時,我不必搜尋解決方案來檢查是否已在其他地方使用相同的會話密鑰。

更新: 這是一個 VB 版本(從 C# 版本自動轉換)。對不起,但我不懂 VB,所以我不知道如何在 VB 中編寫屬性:

Public Class MySession
   ' Private constructor (use MySession.Current to access the current instance).
   Private Sub New()
   End Sub

   ' Gets the current session.
   Public Shared ReadOnly Property Current() As MySession
       Get
           Dim session As MySession = TryCast(HttpContext.Current.Session("__MySession__"), MySession)
           If session = Nothing Then
               session = New MySession()
               HttpContext.Current.Session("__MySession__") = session
           End If
           Return session
       End Get
   End Property

   ' My session data goes here:
   Public MyString As String
   Public MyFlag As Boolean
   Public MyNumber As Integer
End Class

引用自:https://stackoverflow.com/questions/465522