Должен ли я использовать Data Cache или Output Cache для сложного меню навигации?

Я пытаюсь кэшировать разделы навигационного меню в соответствии с различными критериями.

Например, новости и статьи должны обновляться на постоянной основе, тогда как данные для входа в систему и профиля должны кэшироваться для каждого пользователя.

Я рассматриваю 2 варианта - будет ли кто-нибудь достаточно любезен, чтобы рассказать мне о плюсах / минусах каждого? И, если возможно, предложите лучший подход!

Опция 1.

Просто кэшируйте все необходимые HTML в виде строк в кэше данных. При необходимости проверяйте различия между пользователями вручную.

Я (возможно, неправильно) представляю, что это будет наиболее трудоемкой для реализации, но также и наиболее эффективным способом кэширования различных разделов.

Вариант 2

Имейте NavigationController с различными дочерними действиями для каждого раздела меню. (Мы можем применить различный outputCacheProfile к каждому дочернему действию при необходимости.)

Но это потребует от нас вызова отдельного действия RenderAction для каждого раздела меню навигации. И я беспокоюсь об этом из-за комментария к одному из постов Фила Хаака в блоге:

[Render Action] очень похож на выполнение другого запроса, поскольку нам нужно выполнить маршрутизацию, чтобы убедиться, что у нас есть соответствующие данные маршрута и контекст для вызова метода действия. Таким образом, каждый вызов RenderAction будет суммироваться.

Полный пост здесь: http://haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx

1 ответ

Решение

Я думаю, что этого вопроса вообще избегали, потому что здесь нет правильного ответа.

Фактически, ваш выбор архитектуры для реализации сложной навигации определит лучшую стратегию кэширования.


Я глубоко неравнодушен к навигации по частичным представлениям с дочерними действиями.

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

Таким образом, ваша таблица навигации может выглядеть так

grpId    Title        Path
1        Home Page    /
1        About Page   /Home/About
1        Reports Page /Reports
2        Home Page    /
2        Admin Page   /Admin
2        Reports Page /Reports

и ваш ребенок примет участие

[OutputCache(Duration = 60000, VaryByParam = "grpId")]
public PartialViewResult NavigationPage(int grpId)

может вытянуть все параметры вашей группы навигации и визуализировать пользовательское меню навигации. Эта форма кэша вывода настраивается по времени (60000 секунд и ваш параметр)


Заключение:

Я подозреваю, что не сказал вам ничего нового, но только подтвердил то, к чему вы уже склонялись. Среда MVC очень надежна и предоставляет инструменты для удобной обработки того, что вы хотите сделать. Использование файлов и Data Cache также является допустимым методом, но это будет большая головная боль и работа с вашей стороны для реализации.

Имейте в виду: пост Хаака старше 4 лет (MVC 2 Beta). Фреймворк и кеш вывода с тех пор развивались хорошо. Теперь вы можете кэшировать партиалы, не беспокоясь о кэшировании всей страницы. Эта недавняя ссылка на кеширование с помощью MVC 4 не говорит непосредственно о более ранних проблемах Фила, но, в частности, игнорирует их.

Другие вопросы по тегам