2013-05-29 48 views
5

Trong dự án ASP.NET MVC C#:Thêm lớp tùy chỉnh vào HttpContext

Tôi hiện đang sử dụng HttpContext.Itưu trữ một thuộc tính nên được sử dụng ở mọi nơi trong yêu cầu đó. Đây là những gì tôi có trong bộ điều khiển:

HttpContext.Items["IUser"] = new CustomClass(“parameter”); 

này hoạt động tốt để lấy trong giao diện kể từ khi tôi đang trọng các WebViewPage mặc định như thế này trong các tập tin quan web.config:

<pages pageBaseType="Project.CustomWebViewPage"> 

bên trong CustomWebViewPage tôi tạo ra một tài sản và thiết lập nó trong InitHelpers() phương pháp như thế này:

IUser = (CustomClass)HttpContext.Current.Items["IUser"]; 

Tuy nhiên, nếu tôi muốn lấy nó trong mô hình của tôi/ViewModels Tôi sẽ phải đặt đoạn mã đó ở mọi nơi, và do đó tôi nghĩ thay vì tạo ra CustomClass trực tiếp bên trong HttpContext (vì vậy tôi ít nhất sẽ không phải gõ chữ), nhưng tôi không thể tìm cách ghi đè hoặc tự động thêm đối tượng đó vào đối tượng đó.

Trả lời

9

Bạn có thể tạo phương thức tiện ích. Một cái gì đó như thế này:

public static class HttpContextExtensions 
{ 
    public static CustomClass GetUser(this HttpContextBase context) 
    { 
     return (CustomClass)context.Items["IUser"]; 
    } 
} 

Sau đó, bạn sẽ gọi nó là như thế này:

var user = HttpContext.Current.GetUser(); 
5

Gần đây tôi đã phải đối mặt với một vấn đề tương tự. Trong khi tôi đã làm việc với WebForms, giải pháp của tôi cũng nên áp dụng cho MVC.

Tôi đã tạo một đối tượng mới để truy cập các lớp DAL/Business Logic cho mỗi yêu cầu. Điều này cho phép tôi thực hiện các thay đổi đối với logic, bất kể yêu cầu mất bao lâu, hoặc nếu có nhiều yêu cầu được thực thi đồng thời. Ngoài ra nó cho phép đảm bảo xử lý đối tượng của tôi khi yêu cầu kết thúc.

Suy nghĩ đầu tiên của tôi là tạo triển khai tùy chỉnh HttpContextBase, nhưng tôi không thể tìm thấy cách nào để ghi đè việc tạo HttpContext cho yêu cầu.

Vì vậy, cuối cùng tôi đã giới thiệu một phương pháp mở rộng mà gói gọn tất cả các logic:

public static class HttpContextExtensions 
{ 
    public static CustomClass GetIUser(this HttpContextBase Context) 
    { 
     return Context.Items["IUser"] as CustomClass; 
    } 
} 

Bây giờ mã của bạn đơn giản hoá để:

var user = Request.RequestContext.HttpContext.GetIUser(); 
Các vấn đề liên quan