Должен ли я использовать 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 не говорит непосредственно о более ранних проблемах Фила, но, в частности, игнорирует их.