У нас есть приложение MVC3, в котором мы создали множество небольших действий и представлений для размещения данных там, где нам нужно. Например, если это был блог, и мы хотели показать комментарии, у нас есть действие и просмотр комментария, и мы можем разместить его там, где мы хотим, просмотр профиля пользователя, просмотр блога и т. Д.
Проблема, которую это вызвало, заключается в том, что каждое маленькое представление или действие должно совершать вызов, обычно одной и той же службе, несколько раз за загрузку страницы из-за всех других небольших представлений, которые мы имеем в нашем приложении. Таким образом, на очень большой странице, содержащей эти маленькие представления, мы могли бы иметь более 80 вызовов sql, причем 40% из них были дубликатами, и тогда страница замедлялась. Текущее решение состоит в том, чтобы кэшировать некоторые данные и передавать некоторые данные в ViewBag, если мы можем, поэтому, если вы хотите, чтобы он был похож на профиль пользователя, вы проверяете, есть ли его кэш или ViewBag, если он не запрашивает его.
Это кажется действительно очень грязным для шаблона проектирования, и подход к пакету просмотра кажется ужасным, поскольку его нужно передавать сверху вниз. Мы добавили некоторые данные в HttpCurrent.Items, чтобы сделать их по запросу (вместо кэширования, поскольку эти данные могут измениться), но должно быть какое-то чистое решение, которое не кажется неправильным и тоже чистым?
EDIT
Меня попросили быть более конкретным, и, хотя это внутреннее бизнес-приложение, я не могу выделить большую часть деталей.
Итак, приведем это к аналогии с программным обеспечением. Давайте сравним это с фейсбуком. Представьте, что у этого MVC-приложения есть действие для каждой записи в Facebook, затем под этим действием есть еще одно действие для кнопки «Нравится» и количества комментариев, а затем еще одно действие для показа пользователю самых популярных комментариев. При разработке нашего приложения мы будем получать профиль текущего пользователя в каждом действии (например, как минимум 4 раза в описанной выше ситуации), а затем дочернее действие получит сообщение родительской стены, чтобы убедиться, что у вас есть разрешение на его просмотр. Теперь вы можете рассмотреть возможность кэширования вызовов для каждой проверки безопасности, записи на стене и т. Д., Но я чувствую, что кэширование предназначено для вещей, которые понадобятся в течение всего жизненного цикла приложения, а не только для маленьких кусочков, чтобы исправить ошибку в том, как Приложение спроектировано.