У меня есть веб-приложение ASP.NET MVC 3 (Razor) с конкретной страницей с высокой интенсивностью базы данных, а пользовательский опыт имеет самый высокий приоритет.
Таким образом, я представляю кэширование на этой конкретной странице.
Я пытаюсь выяснить способ реализации этого шаблона кэширования, сохраняя мой контроллер тонким, например, в настоящее время он не кэшируется:
public PartialViewResult GetLocationStuff(SearchPreferences searchPreferences)
{
var results = _locationService.FindStuffByCriteria(searchPreferences);
return PartialView("SearchResults", results);
}
Как вы можете видеть, контроллер очень тонкий, как и должно быть. Он не заботится о том, как/откуда он получает информацию - это работа службы.
Несколько заметок о потоке управления:
- Контроллеры получают DI'ed определенную Сервис, в зависимости от ее области. В этом примере этот контроллер получает LocationService
- Службы перейдите в
IQueryable<T>
Репозиторий и внесите результаты вT
илиICollection<T>
.
Как я хочу реализовать кэширование:
- Я не могу использовать кэширование вывода - по нескольким причинам. Прежде всего, этот метод действия вызывается с клиентской стороны (jQuery/AJAX) через
[HttpPost]
, который согласно стандартам HTTP не должен кэшироваться как запрос. Во-вторых, я не хочу кэшировать исключительно на основе аргументов HTTP-запроса - логика кэша намного сложнее, чем есть. На самом деле происходит двухуровневое кэширование. - Как я намекаю выше, мне нужно использовать обычное кэширование данных, например
Cache["somekey"] = someObj;
. - Я не хочу реализовывать общий механизм кэширования, когда все вызовы через службу сначала проходят через кеш - Я хочу только кэшировать этот метод действий.
Сначала я подумал, что мне нужно создать другую службу (которая наследует LocationService) и обеспечивает там рабочий процесс кеширования (сначала проверьте кеш, если не там, вызовите db, добавьте в кеш, верните результат).
Это имеет две проблемы:
- Услуги являются базовыми Библиотеками классов - никаких ссылок на что-либо дополнительное. Мне нужно добавить ссылку на
System.Web
здесь. - Мне нужно будет получить доступ к Контексту HTTP за пределами веб-приложения, которое считается плохой практикой, а не только для проверки, но в целом - правильно?
Я также подумал об использовании папки Models
в веб-приложении (которую я сейчас использую только для ViewModels), но наличие службы кеша в папке с моделями просто не звучит правильно.
Итак - какие-нибудь идеи? Есть ли какая-то MVC-специфическая вещь (например, Action Filter, например), которую я могу использовать здесь?
Приветствуются общие советы/советы.