我正在将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 实现了IServiceProvider。GetService方法在哪里寻找服务?这很容易被嘲笑吗?