15

我正在将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 属性如何是缓存提供程序的抽象。它是传统的密封缓存类。似乎我不是唯一一个努力模拟框架中的类的人。

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

4

2 回答 2

18

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

ASP.NET 4.0 包含一个输出缓存提供程序抽象(AFAIK不是通用缓存抽象,但仅用于输出缓存)

于 2009-05-17T18:58:02.320 回答
2

这个答案已经过时了。请参阅ASP.NET 4.0:编写自定义输出缓存提供程序

于 2012-08-05T19:08:30.350 回答