В информатике нас учили, что каждый метод должен делать одно и только одно. Я немного запутался тогда, когда мы видим действия MVC, такие как следующие , приведенные в качестве примеров хорошей практики :
[AcceptVerbs(HttpVerbs.Post), Authorize]
public ActionResult Edit(int id, FormCollection collection) {
Dinner dinner = dinnerRepository.GetDinner(id);
if (!dinner.IsHostedBy(User.Identity.Name))
return View("InvalidOwner");
try {
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch {
ModelState.AddModelErrors(dinner.GetRuleViolations());
return View(new DinnerFormViewModel(dinner));
}
}
В основном этот фрагмент кода предоставляет множество функций:
- Определяет, как получить доступ к действию - только публикация
- Определяет, кто может получить доступ к действию - Авторизоваться
- Доступ к механизму персистентности - ужинРепозиторий
- Доступ к информации о состоянии - (User.Identity.Name)
- Преобразует NameValueCollection в строго типизированный объект - UpdateModel ()
- Указывает 3 возможных ActionResults и содержимое для каждого - InvalidOwner / Details / Редактировать представления
Мне кажется, это слишком много обязанностей для одного метода. Это также довольно простое действие, т. Е. Оно не касается общих сценариев, таких как:
- Проверка бизнес-правил - «Никогда не доверяйте вводу пользователя»
- Пути навигации - при успешном сохранении всегда возвращается «Подробности»
- Различные типы возвращаемых данных. Кто-то хочет вызвать «Edit» из сетки и нуждается в JsonResult?
- Лучшая обработка ошибок - YSOD, если база данных недоступна во время GetDinner (id)
- Построение дополнительных данных представления - списки выбора для выпадающих списков
Не слишком упоминать объем тестирования, требуемого для этого единственного метода, то есть насмешки / подделки для FormCollection / UserIdentity / Authorization Provider / Repository / etc.
Мой вопрос: как нам избежать того, чтобы в наши действия контролера впихивалось так много вещей?
Я склонен думать, что "мнения" - это отличная концепция, особенно "Принцип Громовой смерти". Хотя я испытываю большое уважение к парням, которые занимаются сборкой FubuMVC , и к причинам, стоящим за этим, мне нужно кое-что, что я могу использовать прямо сейчас.
Редактировать - Ну, похоже, я хотел что-то вроде этого - Мнение Контроллера . Мне нужно изучить его дальше, так как это для MVC Preview 5, поэтому мне, возможно, придется обновить его самому.