2010-05-14 40 views
6

Tôi chỉ là một người mới đến với ASP.NET MVC và không chắc chắn làm thế nào để đạt được một nhiệm vụ nhất định "đúng cách".ASP.NET MVC AuthorizeAttribute truyền giá trị cho ActionMethod?

Về cơ bản, tôi lưu trữ userId đã đăng nhập trong HttpContext.User.Identity và đã viết EnhancedAuthorizeAttribute để thực hiện một số ủy quyền tùy chỉnh.

Trong phương pháp được ghi đè lên OnAuthorization, mô hình miền của tôi truy cập cơ sở dữ liệu để đảm bảo id người dùng hiện tại có thể truy cập thông qua routeValue "BatchCode". Nguyên mẫu là:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode); 

Nó sẽ trả về null nếu người dùng không thể truy cập Nhóm đánh giá và OnAuthorization sau đó từ chối truy cập.

Bây giờ, tôi biết phương pháp hành động được trang trí sẽ chỉ được thực thi nếu OnAuthorization vượt qua, nhưng tôi không muốn nhấn cơ sở dữ liệu lần thứ hai để có được ReviewGroup một lần nữa.

Tôi đang nghĩ đến việc lưu trữ Nhóm đánh giá trong HttpContext.Items["reviewGroup"] và truy cập điều này từ bộ điều khiển tại thời điểm này.

Đây có phải là giải pháp khả thi hay tôi đang đi sai đường?

Cảm ơn!

Trả lời

1

HttpContext.Items chỉ hoạt động trong thời gian yêu cầu. Nếu bạn muốn kéo dài nó trong một thời gian lâu hơn, bạn nên đặt nó trong

a) phiên - tốt

b) hồ sơ - dont thấy lợi thế

c) cookie - không được khuyến khích

d) nhấn vào cơ sở dữ liệu mọi lúc - phải là OK

Lưu trữ trong filterContext.RouteData.DataTokens?

+0

Không, tôi không cần đối tượng ReviewGroup cho nhiều yêu cầu. Thực sự, tất cả những gì tôi cần là truyền đối tượng này (thu được trong AuthorizeAttribute.OnAuthorization()) tới ActionMethod(). –

0

Trừ khi bạn thực hiện một lựa chọn rất lớn từ ReviewGroup hoặc bạn có một cơ sở dữ liệu khổng lồ, thì lần truy cập cơ sở dữ liệu thứ hai sẽ không quá nhiều vấn đề. Cơ sở dữ liệu hiện đại rất hiệu quả trong việc lựa chọn, đặc biệt là với các bảng được lập chỉ mục phù hợp.

Theo kinh nghiệm của tôi, đây là cách tốt nhất để thực hiện ủy quyền và phương pháp tương tự như cách tôi đã ủy quyền các hành động cụ thể trong các ứng dụng của mình.

Vì vậy, trong ngắn hạn, tôi sẽ không lo lắng gì về lần truy cập cơ sở dữ liệu thứ hai.

1

Ngoài ra, một trong những cách tốt nhất để tránh nhấn cơ sở dữ liệu và dễ nhất là lưu vào bộ nhớ đệm. Truy xuất nó, dán vào bộ nhớ cache. Nếu nó là cần thiết một lần nữa nó đã có trong bộ nhớ và không có hit DB là cần thiết. Nếu không, sau đó khi bộ nhớ cache đi ra khỏi phạm vi, do đó, sẽ đối tượng.

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