我正在将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实现了IServiceProvider。 GetService方法在哪里寻找服务?这可以轻易嘲笑吗?
答案 0 :(得分:18)
缓存没有正式的抽象或提供程序,但您可以轻松构建一个:
ASP.NET 4.0包含output cache provider abstraction(AFAIK 不是通用缓存抽象,但仅用于输出缓存)
答案 1 :(得分:2)
这个答案已经过时了。请参阅ASP.NET 4.0: Writing custom output cache providers。