Я задам вам вопрос в нескольких частях. Во-первых, по своей сути плохо использовать статические переменные или шаблоны кэширования в MVC. Ответ просто нет. Пока ваша архитектура поддерживает их, это нормально. Просто поместите ваш кеш в нужное место и создайте тестируемость, как я объясню позже.
Вторая часть - это «правильный» способ сохранить этот тип постоянных данных, чтобы вам не приходилось совершать поездки в БД для заполнения общих элементов пользовательского интерфейса. Для этого я не рекомендую хранить объекты EF. Я хотел бы создать объекты POCO (View модели или аналогичные), которые вы кэшируете. Так что в примере с вашими 50 штатами у вас может быть что-то вроде этого:
public class State
{
public string Abbreviation { get; set; }
public string Name { get; set; }
}
Тогда вы бы сделали что-то подобное для создания своего кэшированного списка:
List<State> states = Context.StateData.Select(s => new State { Abbreviation = s.Abbreviation, Name = s.Name}).ToList();
Наконец, каким бы ни было ваше решение для кэширования, в нем должен быть реализован интерфейс, позволяющий смоделировать этот метод кэширования для тестирования.
Чтобы сделать это без использования циклических ссылок или использования отражения, вам потребуется как минимум 3 сборки:
Ваше приложение MVC
Библиотека классов для определения ваших объектов и интерфейсов POCO
Библиотека классов выполняет доступ к данным и кеширование (очевидно, что это можно разделить на 2 библиотеки, если это облегчает поддержку и / или тестирование)
Таким образом, вы можете иметь что-то подобное в своем коде MVC:
ICache myCache = CacheFactory.CreateCache();
List<State> states = myCache.ListStates();
// populate your view model with states
Где ICache и State находятся в одной библиотеке, а ваша фактическая реализация ICache - в другой.
Это то, что я делаю для своей стандартной архитектуры: разделение объектов POCO и интерфейсов, которые не зависят от доступа к данным, в отдельную библиотеку от доступа к данным, который отделен от моего приложения MVC.