Как реализовать пользовательский поставщик кеша с 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 не является общей абстракцией кэша, а только для кэширования вывода)
Ответ 2
Этот ответ устарел. См. ASP.NET 4.0: Создание пользовательских поставщиков кэшей вывода.