我有一個ASP.NET MVC 3(Razor)Web應用程序,其中一個特定頁面是高度數據庫密集型,用戶體驗是最重要的。如何在不違反MVC模式的情況下實現緩存模型?
因此,我在這個特定的頁面上引入了緩存。
我試圖想出一個辦法來實現這個緩存模式,同時保持我的控制器薄,喜歡它目前是沒有緩存:
public PartialViewResult GetLocationStuff(SearchPreferences searchPreferences)
{
var results = _locationService.FindStuffByCriteria(searchPreferences);
return PartialView("SearchResults", results);
}
正如你所看到的,控制器是非常薄,因爲它應該是。它不關心如何/從哪裏獲取信息 - 這是服務的工作。
上控制流有兩點要注意:
- 控制器得到DI'ed特定服務,這取決於它的面積。在這個例子中,該控制器GET是一個LocationService
- 服務電話接到一個
IQueryable<T>
庫和物化成果轉化爲T
或ICollection<T>
。
如何我想實現緩存:
- 我不能使用輸出緩存 - 有幾個原因。首先,這個動作方法是通過
[HttpPost]
從客戶端(jQuery/AJAX)調用的,它根據HTTP標準不應該被緩存爲請求。其次,我不想純粹基於HTTP請求參數進行緩存 - 緩存邏輯比這更復雜 - 實際上存在兩級緩存。 - 正如我上面提到的,我需要使用常規數據緩存,例如
Cache["somekey"] = someObj;
。 - 我不想實現一個通用的緩存機制,其中全部通過服務調用首先通過緩存 - 我只想緩存這個特定的動作方法。
首先想到的會告訴我創建另一個服務(它繼承LocationService),並提供高速緩存的工作流程有(先檢查高速緩存,如果不是有叫分貝,增加緩存,返回結果)。
有兩個問題:
- 的服務是基本類庫 - 對任何額外的引用。我需要在這裏添加對
System.Web
的引用。 - 我將不得不訪問Web應用程序之外的HTTP上下文,這被認爲是不好的做法,不僅是爲了可測試性,而是在一般情況下 - 對嗎?
我也想過使用Models
文件夾中的Web應用程序(這是我目前只使用的ViewModels),但有一個緩存服務的模型文件夾只是不健全的權利。
那麼 - 任何想法?是否有MVC特定的東西(例如Action Filter的),我可以在這裏使用?
一般諮詢/提示將不勝感激。
``我只想緩存在這個特定的動作方法上`` - 聽起來像是在尋求一個ActionFilter解決方案。 – Omar 2011-02-06 23:18:45