Tôi không thể nhớ cho cuộc sống của tôi, nơi tôi khiêm tốn lại có mục tiêu mã này từ, nhưng nó khá đẹp:
using System;
using System.Web;
namespace Project.Web.UI.Domain
{
public abstract class SessionBase<T> where T : class, new()
{
private static readonly Object _padlock = new Object();
private static string Key
{
get { return typeof(SessionBase<T>).FullName; }
}
public static T Current
{
get
{
var instance = HttpContext.Current.Session[Key] as T;
lock (SessionBase<T>._padlock)
{
if (instance == null)
{
HttpContext.Current.Session[Key]
= instance
= new T();
}
}
return instance;
}
}
public static void Clear()
{
var instance = HttpContext.Current.Session[Key] as T;
if (instance != null)
{
lock (SessionBase<T>._padlock)
{
HttpContext.Current.Session[Key] = null;
}
}
}
}
}
Ý tưởng đằng sau nó hai lần. Loại được tạo nên là loại duy nhất bạn cần. Về cơ bản nó là một trình bao bọc mạnh mẽ. Vì vậy, bạn có một số đối tượng bạn muốn tiếp tục mở rộng thông tin trong:
public class MyClass
{
public MyClass()
public string Blah1 { get; set; }
}
Sau đó xuống đường bạn mở rộng MyClass
và bạn không muốn phải nhớ tất cả các giá trị Key, lưu trữ chúng trong AppSettings hoặc biến Const trong Lớp tĩnh. Bạn chỉ cần xác định những gì bạn muốn lưu trữ:
public class MyClassSession : SessionBase<MyClass>
{
}
Và ở bất cứ đâu trong chương trình, bạn chỉ cần sử dụng lớp học.
// Any Asp.Net method (webforms or mvc)
public void SetValueMethod()
{
MyClassSesssion.Current.Blah1 = "asdf";
}
public string GetValueMethod()
{
return MyClassSession.Current.Blah1;
}
Nguồn
2012-06-19 21:58:49
1 Đây là mô hình tôi có xu hướng đi theo - nó thực sự giúp loại bỏ những lỗi typo pesky. –
Bạn không nên sử dụng 'const' trong ngữ cảnh này. 'readonly tĩnh' là thích hợp hơn (và an toàn). – EkoostikMartin
Làm thế nào để giảm bớt nguyên tắc không lặp lại chính mình? Bạn vẫn viết cùng một lớp lót ở khắp mọi nơi, bạn chỉ sử dụng một biến không đổi thay vì một chuỗi ký tự cho khóa? – BlackSpy