Можно ли вводить частные методы в контроллер или я должен отделить их от некоторого типа вспомогательного класса с asp.net mvc?
У меня есть контроллер, который загружает несколько выпадающих списков в зависимости от типа пользователя. Например:
public ActionResult Index()
{
switch (SessionHelper.ViewLimit)
{
case "C":
ViewData["CustDivision"] = LoadCustDivisions();
ViewData["Customer"] = LoadCustomers();
break;
case "P":
ViewData["Customer"] = LoadCustomers();
ViewData["Employee"] = LoadEmployees();
break;
case "D":
ViewData["Customer"] = LoadCustomers();
ViewData["Division"] = LoadDivisions();
break;
default:
return RedirectToAction("Logout", "Account");
}
return View()
}
Прежде всего, относится ли оператор switch к контроллеру, и, во-вторых, если это так, где я должен поставить LoadCustomers(), LoadDivisions(), LoadEmployees()?
Ответы
Ответ 1
Я чувствую НЕТ - частный метод в контроллере создает больше проблем, чем они решают. Вот мои причины:
К тому моменту, когда вам хочется создать частный метод в контроллере, вы определили фрагмент кода, который является "немногочисленным" и "грязным", или повторяющимся. Это достаточная причина для создания отдельного вспомогательного класса или перемещения кода вниз по стеку.
Класс-помощник, даже с одним методом, намного проще тестировать и издеваться. Также он создает более сильное логическое разделение беспокойства. Это облегчает работу при отладке.
Я также соглашаюсь с tvanfosson на использовании шаблона стратегии, чтобы не изобретать колесо и демонстрировать более зрелое понимание разработки программного обеспечения.
Но на самом деле это одна из тех ситуаций, в которых вы можете спорить обеими веками. Но это сводится к уровню мастерства, к которому вы стремитесь, или, точнее, к соглашению.
Ответ 2
Если они используются только в этом контроллере, я бы сказал, что оставить их закрытыми для контроллера в порядке. Как только вы обнаружите, что у вас есть потребность в них в другом месте, попробуйте перенести их в свой DAL или вспомогательный класс.
Чем больше вопрос о вашей архитектуре - использование операторов switch или шаблона стратегии и т.д. - трудно ответить только из этого фрагмента. Я не особо обиделся на этот оператор switch, но вы можете захотеть, чтобы ваш SessionHelper вернул стратегию, которая будет загружать правильные данные просмотра для вас. В этом случае код для загрузки представления будет идти в классе стратегии.
DataStrategy strategy = SessionHelper.GetDataStrategy()
if (strategy == null)
{
RedirectToAction("Logout","Account");
}
strategy.LoadViewData( ViewData );
return View();
Ответ 3
Поскольку ASP.NET MVC поддерживает соглашение по конфигурации, любые общедоступные методы в классе, заканчивающемся на контроллере, считаются действительными. Если они частные, это не так.
Итак, вполне нормально иметь частные методы в классе контроллера.