Я переношу приложение 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 будет искать службы? Можно ли это легко высмеивать?