我有一个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