如何使用ASP.NET MVC实现自定义缓存提供程序

时间:2009-05-16 21:25:57

标签: asp.net-mvc caching provider

我正在将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和tell的自定义缓存提供程序 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类。似乎我不是框架中唯一一个struggling to mock的类。

我是ASP.NET MVC框架的新手,我必须在这里遗漏一些东西。我可以编写一个CustomBaseController,它使用我定义的ICacheProvider接口 我的所有控制器都派生自这个基类,但是如果有一个更优雅的(ASP.NET MVCish)解决方案,我很乐意实现它。我注意到HttpContextBase实现了IServiceProviderGetService方法在哪里寻找服务?这可以轻易嘲笑吗?

2 个答案:

答案 0 :(得分:18)

缓存没有正式的抽象或提供程序,但您可以轻松构建一个:

ASP.NET 4.0包含output cache provider abstraction(AFAIK 不是通用缓存抽象,但仅用于输出缓存)

答案 1 :(得分:2)

这个答案已经过时了。请参阅ASP.NET 4.0: Writing custom output cache providers