Как реализовать пользовательский поставщик кеша с ASP.NET MVC

Я переношу приложение 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 использовать мой поставщик кэша вместо стандартного. Было также очень легко насмехаться и unit test мой контроллер.

В ASP.NET MVC 1.0 сборка System.Web.Abstractions(имя выглядит многообещающей), которая определяет HttpContextBase следующим образом:

public abstract class HttpContextBase : IServiceProvider
{
    ... 
    public virtual System.Web.Caching.Cache Cache { get; }
    ...
}

Я не понимаю, как свойство Cache, используемое здесь, является абстракцией поставщика кеша. Это наследие, запечатанное Cache. Кажется, что я не единственный пытающийся издеваться над классами в рамках.

Я очень новичок в структуре ASP.NET MVC, и мне здесь что-то не хватает. Я мог бы написать CustomBaseController, который использует интерфейс ICacheProvider, который я определяю и все мои контроллеры вытекают из этого базового класса, но если есть более элегантный (ASP.NET MVCish) решение, я был бы рад его реализовать. Я заметил, что HttpContextBase реализует IServiceProvider. Где метод GetService будет искать службы? Можно ли это легко высмеивать?

Ответы

Ответ 1

Кэш не имеет официальной абстракции или поставщика, но вы можете легко создать его:

ASP.NET 4.0 включает в себя абстракцию поставщика кэша вывода (AFAIK не является общей абстракцией кэша, а только для кэширования вывода)