#c# #asp.net-mvc-3 #coding-style
#c# #asp.net-mvc-3 #стиль кодирования
Вопрос:
У меня есть контроллер с несколькими методами действий, требующими одного и того же списка данных из определенной базы данных. Поскольку для большинства действий требовался доступ к списку, я быстро заполнил закрытую переменную-член необходимым списком элементов данных непосредственно в конструкторе моего контроллера.
Все было хорошо и хорошо, пока база данных не вышла из строя и в конструкторе не возникло исключение. По-видимому, это обходит обычную функциональность HandleError.
Моя цель состоит в том, чтобы это исключение было перехвачено и пользователь перенаправлен на представление ошибки.
- Как правильно загружать данные для всех действий?
- Уместно ли помещать вызов базы данных в OnActionExecuting?
- Есть ли какой-нибудь способ украсить конкретные действия атрибутом, который загружает данные?
- Я переоцениваю это? (В конце концов, я мог бы просто удалить частный метод в контроллере и вызывать его из каждого действия, требующего данных)
Ответ №1:
Вы могли бы создать частный метод и заставить его заполнить ваш список (если он еще не заполнен), а затем вернуть список. Таким образом, вы вызываете метод только для его заполнения, когда это необходимо в первый раз, и вы извлекаете хрупкий код из конструктора вашего контроллера. Обрабатывать исключение в ваших методах действий будет намного проще, чем в других местах.
Ответ №2:
Контроллеры (как объекты) создаются для каждого запроса. Поэтому нет необходимости оптимизировать данные внутри контроллера, которые будут «повторно использоваться» во многих действиях (как предложил Джефф Редди). Если вы не вызываете метод действия явно из другого метода действия (что в любом случае является плохой практикой).
Создайте частный метод getData(), который получает данные из базы данных, и вызывайте его при каждом действии.
Однако вы, вероятно, хотите избежать дорогостоящих обходов базы данных, которые получают одни и те же данные снова и снова, а затем рассмотрите возможность использования HttpRuntime.Кэш. Вы можете сохранять данные там при первом вызове getData() и извлекать их из кэша при последующих запросах.
Комментарии:
1. Сергей, ты только повторил то, что я предложил. Частный метод, который получает данные и вызывается из каждого действия. Я неявно предложил кэшировать данные списка, когда сказал, что он заполняется только в первый раз. Последующие вызовы будут получать данные списка из того места, где они были кэшированы.
Ответ №3:
Если вам нужна модель во всех действиях вашего контроллера, вы можете определить пользовательскую привязку модели для данной модели и переопределить метод BidModel, который будет запрашивать базу данных и заполнять эту модель. Тогда ваши действия контроллера могут принимать эту модель в качестве аргумента действия:
public ActionResult Foo(MyModel model)
{
...
}
public ActionResult Bar(MyModel model)
{
...
}
Если вам не нужна модель внутри каждого действия, но внутри каждого представления, вы можете использовать ее как виджет, используя помощник Html.RenderAction.