【发布时间】: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 实现了IServiceProvider。 GetService 方法在哪里寻找服务?这很容易被嘲笑吗?
【问题讨论】:
标签: asp.net-mvc caching provider