我正在将MonoRail应用程序迁移到ASP.NET MVC 1.0.在我的原始应用程序中,我编写了一个自定义缓存提供程序(使用memcached分布式缓存提供程序)在MonoRail中,这个任务非常简单,因为框架使用了接口,并且ICacheProvider看起来像这样:
public interface ICacheProvider : IProvider, IMRServiceEnabled { void Delete(string key); object Get(string key); bool HasKey(string key); void Store(string key, object data); }
每个控制器操作都提供此接口的实例.因此,我所要做的就是实现一个使用memcached的自定义缓存提供程序,并告诉MonoRail使用我的缓存提供程序而不是默认缓存提供程序.模拟和单元测试我的控制器也很容易.
在ASP.NET MVC 1.0中,System.Web.Abstractions程序集(名称看起来很有希望)定义了HttpContextBase,如下所示:
public abstract class HttpContextBase : IServiceProvider { ... public virtual System.Web.Caching.Cache Cache { get; } ... }
我不明白这里使用的Cache属性是如何缓存提供者的抽象.它是传统的密封Cache类.似乎我不是唯一一个努力模仿框架中的类的人.
我是ASP.NET MVC框架的新手,我必须在这里遗漏一些东西.我可以编写一个CustomBaseController,它使用我定义的ICacheProvider接口,我的所有控制器都派生自这个基类,但如果有一个更优雅的(ASP.NET MVCish)解决方案,我很乐意实现它.我注意到HttpContextBase实现了IServiceProvider.哪来的GetService的方法去寻找服务?这可以轻易嘲笑吗?
Cache没有官方抽象或提供程序,但您可以轻松构建一个:
http://weblogs.asp.net/zowens/archive/2008/08/04/cache-abstraction.aspx
http://memcachedproviders.codeplex.com/SourceControl/changeset/view/15983#58762
ASP.NET 4.0包含输出缓存提供程序抽象(AFAIK 不是通用缓存抽象,但仅用于输出缓存)