2010-03-05 26 views
5

Rõ ràng, cách tiếp cận WebForms điển hình sẽ không hoạt động. Làm cách nào để theo dõi người dùng trong thế giới MVC?Mô hình được chấp nhận cho việc thực hiện Phiên trong các trang ASP.NET MVC là gì?

+0

Tôi quan tâm đến bản thân mình. Cá nhân tôi muốn giữ một đường dẫn bánh mì nhưng tôi không muốn vượt qua điều này trong chuỗi truy vấn. Bạn muốn theo dõi cụ thể người dùng nào? –

+1

"Cách tiếp cận WebForms điển hình" là gì sẽ không hoạt động? –

Trả lời

22

Phiên làm việc chính xác giống như cách hoạt động trong Biểu mẫu web. Nếu bạn muốn lưu trữ thông tin đơn giản, hãy sử dụng cookie xác thực biểu mẫu. Nếu bạn muốn lưu trữ một nội dung của giỏ mua hàng, phiên là nơi để đi. Tôi đã viết một entry blog về using Session with ASP.NET:

Cho phép nói rằng chúng ta muốn lưu trữ một biến số nguyên trong Session.We sẽ tạo ra bao bọc xung quanh các phiên biến mà làm cho nó trông đẹp hơn:

Đầu tiên chúng ta định nghĩa giao diện:

public interface ISessionWrapper 
{ 
    int SomeInteger { get; set; } 
} 

Sau đó, chúng ta thực hiện HttpContext thực hiện:

public class HttpContextSessionWrapper : ISessionWrapper 
{ 
    private T GetFromSession<T>(string key) 
    { 
     return (T) HttpContext.Current.Session[key]; 
    } 

    private void SetInSession(string key, object value) 
    { 
     HttpContext.Current.Session[key] = value; 
    } 

    public int SomeInteger 
    { 
     get { return GetFromSession<int>("SomeInteger"); } 
     set { SetInSession("SomeInteger", value); } 
    } 
} 

GetFromSession và SetInSession là phương pháp helper mà làm việc và s đặt cược dữ liệu trong phiên dễ dàng hơn. Thuộc tính SomeInteger sử dụng các phương thức này.

Sau đó, chúng ta định nghĩa điều khiển cơ sở của chúng tôi (áp dụng đối với ASP.NET MVC):

public class BaseController : Controller 
{ 
    public ISessionWrapper SessionWrapper { get; set; } 

    public BaseController() 
    { 
     SessionWrapper = new HttpContextSessionWrapper(); 
    } 
} 

Nếu bạn muốn sử dụng phiên điều khiển bên ngoài, bạn chỉ cần tạo hoặc tiêm HttpContextSessionWrapper mới().

Bạn có thể thay thế SessionWrapper bằng ISessionWrapper giả lập trong kiểm tra Bộ điều khiển, do đó, nó không phụ thuộc vào HttpContext nữa. Session cũng dễ sử dụng hơn, bởi vì thay vì gọi (int) Session ["SomeInteger"], bạn gọi SessionWrapper.SomeInteger. Trông đẹp hơn phải không?

Bạn có thể bị cám dỗ bởi việc tạo lớp tĩnh bao gồm đối tượng Session và không yêu cầu xác định bất kỳ giao diện hoặc khởi tạo trong BaseController, nhưng nó mất một số lợi thế, đặc biệt khi nói đến thử nghiệm và thay thế .

+0

Tại sao bạn sẽ viết một giao diện và một lớp bao bọc khi khung công tác đã cung cấp cho bạn 'HttpContext.Current.Session [key]'? –

+8

Bởi vì: 1. var cart = (Danh sách ) HttpContext.Current.Session [key] trông ghê tởm và SessionWrapper.CartItems trông đẹp. 2. Nó dễ dàng hơn để viết kiểm tra cho ISessionWrapper. ISessionWrapper có thể dễ dàng giả lập và được thay thế bằng nội dung cho các kịch bản thử nghiệm khác nhau. 3. Nó mất sự phụ thuộc. Nếu tôi muốn sử dụng một kho lưu trữ thay vì Session, tôi chỉ cần tạo ISessionWrapper khác. Bạn phải thay thế mã trong mọi bộ điều khiển sử dụng Session. – LukLed

+0

điểm tốt. Mặc dù tôi không thể lấy lại phần còn lại trừ khi bạn chỉnh sửa bài đăng. –

2

Dưới đây là một mã mà tôi sử dụng, chỉ cần một chút "cải thiện" phiên bản của phiên bản trên:

private T GetFromSessionStruct<T>(string key, T defaultValue = default(T)) where T : struct 
{ 
    object obj = HttpContext.Current.Session[key]; 
    if (obj == null) 
    { 
     return defaultValue; 
    } 
    return (T)obj; 
} 

private T GetFromSession<T>(string key) where T : class 
{ 
    object obj = HttpContext.Current.Session[key]; 
    return (T)obj; 
} 

private T GetFromSessionOrDefault<T>(string key, T defaultValue = null) where T : class 
{ 
    object obj = HttpContext.Current.Session[key]; 
    if (obj == null) 
    { 
     return defaultValue ?? default(T); 
    } 
    return (T)obj; 
} 

private void SetInSession<T>(string key, T value) 
{ 
    if (value == null) 
    { 
     HttpContext.Current.Session.Remove(key); 
    } 
    else 
    { 
     HttpContext.Current.Session[key] = value; 
    } 
} 
+0

bạn sẽ triển khai như thế nào, bạn có thể chỉ cho chúng tôi một số ví dụ về mã ở trên không –

Các vấn đề liên quan