Можно ли помещать закрытые методы в мой контроллер или я должен разделить их на некоторый тип вспомогательного класса с помощью asp.net mvc? - PullRequest
14 голосов
/ 14 марта 2009

У меня есть контроллер, который загружает некоторые выпадающие списки в зависимости от типа пользователя. Например:

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 ()?

Ответы [ 3 ]

15 голосов
/ 22 ноября 2012

Я чувствую НЕТ - приватный метод в контроллере создает больше проблем, чем они решают. Вот мои причины:

К тому времени, когда вы захотите создать приватный метод в контроллере, вы уже определили фрагмент кода, который немного "грязный" или повторяется. Этого достаточно для создания отдельного вспомогательного класса или перемещения кода вниз по стеку.

Вспомогательный класс, даже с одним методом, намного проще тестировать и макетировать. Также это создает более сильное логическое разделение интересов. Это облегчает работу при отладке.

Я также согласен с tvanfosson в использовании шаблона стратегии, чтобы не изобретать велосипед и продемонстрировать более зрелое понимание разработки программного обеспечения.

Но на самом деле, это одна из тех ситуаций, когда вы можете спорить обоими путями в вечности. Но это сводится к уровню мастерства, к которому вы стремитесь, или, точнее, к желанию согласиться.

11 голосов
/ 14 марта 2009

Если они используются только в этом контроллере, я бы сказал, что оставить их закрытыми для контроллера - это нормально. Как только вы обнаружите, что они вам нужны где-то в другом месте, найдите их в своем DAL или вспомогательном классе.

Более сложный вопрос о вашей архитектуре - использование операторов переключения или шаблона стратегии и т. Д. - трудно ответить только из этого фрагмента. Я не особенно обижен этим оператором switch, но вы можете попросить SessionHelper вернуть стратегию, которая будет загружать правильные данные представления для вас. В этом случае код для загрузки представления будет идти в классе стратегии.

  DataStrategy strategy = SessionHelper.GetDataStrategy()
  if (strategy == null)
  {
       RedirectToAction("Logout","Account");
  }

  strategy.LoadViewData( ViewData );

  return View();
3 голосов
/ 14 марта 2009

Поскольку ASP.NET MVC предпочитает соглашение по конфигурации, любые открытые методы в классе, заканчивающемся на Controller, считаются методами действия. Если они частные, то нет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...