【问题标题】:How to implement a custom cache provider with ASP.NET MVC如何使用 ASP.NET MVC 实现自定义缓存提供程序
【发布时间】:2010-10-26 18:41:58
【问题描述】:

我正在将 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 类。看来我不是框架中所有类中唯一的struggling to mock

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

【问题讨论】:

    标签: asp.net-mvc caching provider


    【解决方案1】:

    缓存没有官方的抽象或提供者,但您可以轻松构建一个:

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

    【讨论】:

    • @mausch,这正是我结束的工作。第一篇文章中唯一不清楚的是如何使用 IoC 在 HttpContext 管道中注入缓存抽象,以便可以从任何地方访问它。
    • 我不会尝试在 HttpContext 中注入它。相反,只需在控制器中注入您的抽象(ICache 或其他任何名称)。
    【解决方案2】:

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

    【讨论】:

    • 它没有过时。 输出缓存 现在是可插入的(我确实在 2010 年将其添加到我的答案中),但不是通用缓存。
    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2017-06-15
    • 1970-01-01
    • 2015-03-22
    相关资源
    最近更新 更多