Подтвердить что ты не робот

Можно ли вводить частные методы в контроллер или я должен отделить их от некоторого типа вспомогательного класса с 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()?

4b9b3361

Ответ 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 поддерживает соглашение по конфигурации, любые общедоступные методы в классе, заканчивающемся на контроллере, считаются действительными. Если они частные, это не так.

Итак, вполне нормально иметь частные методы в классе контроллера.