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