уменьшение размера контроллера asp.net mvc - PullRequest
5 голосов
/ 04 марта 2011

У меня есть контроллер. "OrderController". В настоящее время это 1800 строк. Мне нравится уменьшать размер. Я использую статические вспомогательные методы, и это нормально, но я использую ninject для вызова своих репозиториев, поэтому у меня нет доступа к репозиториям в статических методах без передачи свойств.

Какие есть хорошие подходы для снижения шума контроллера?

Ответы [ 3 ]

9 голосов
/ 04 марта 2011

Как получить тонкий контроллер

  1. Рефакторинг многократно используемых функций, которые могут применяться к нескольким типам вывода до ActionFilters. Следствие: Меньше повторяющегося кода, более тонкие действия контроллера, более быстрое будущее развитие

  2. Рефакторинг многократно используемых функций, которые применяются к определенному типу вывода для пользовательского ActionResult. Следствие: Меньше повторяющегося кода, более тонкие действия контроллера, более быстрое будущее развитие

  3. Плечо ModelBinders для привязки ваших входных значений к сложным объектам, которые вводятся в ваше действие Controller. Следствие: Вам вообще не нужно обрабатывать фактический ввод HTTP (RouteData, значения формы, параметры строки запроса) в вашем контроллере. Вы также можете выполнить проверку данных в связывателе модели.

  4. Реализация внедрения зависимостей через пользовательский ControllerFactory. Следствие: Вам не нужно создавать службы в вашем контроллере.

  5. Рефакторинг отдельных контроллеров с чрезмерным количеством действий контроллера на несколько контроллеров. Последствия: Ваш код становится более понятным.

  6. Переместите ваши статические вспомогательные методы в статические классы. Следствие: Ваши методы становятся многократно используемыми несколькими контроллерами, и у вас меньше раздутого кода в контроллере, поэтому его легче поддерживать и вносить изменения в ваше приложение.

Другие заметки

Для решения этих задач существует множество ресурсов с открытым исходным кодом. Я определенно предлагаю заглянуть в проект MvcContrib. Они имеют базовый класс FluentController, который был разработан с учетом создания тонких контроллеров. Кроме того, я проголосовал за Дарина, потому что видео, которое он рекомендовал, полезно, так что зацените его

1 голос
/ 04 марта 2011

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

Я бы посмотрел и подумал над ответом на этот SO вопрос:

Шаблоны ASP.NET MVC

Вкратце:

  1. Сложность сложностей в классы Service, которые выполняют четкую задачу, т. Е. Предоставляют то, что нужно контроллеру.

  2. Контроллер должен просто иметь логику приложения, т. Е. Он должен просто действовать как своего рода воздушный трафик, хм, контроллер, отправляющий запросы таким образом и основанный на логике приложения.Это в значительной степени его функция в двух словах.Другие вещи не принадлежат контроллеру.

Мои контроллеры выглядят так:

[Authorize(Roles="Admin, Tutor, Pupil")]
public partial class CourseController : Controller
{
    ICourseDisplayService service;
    public CourseController(ICourseDisplayService service)
    {
        this.service = service;
    }

    public virtual ActionResult Browse(int CourseId, string PupilName, string TutorName)
    {
        service.Initialize(CourseId, 1, PupilName, TutorName, User);
        service.CurrentStepOrder = service.ActiveStepIndex;
        if (Request.IsAjaxRequest())
        {
            return PartialView(MVC.Courses.Course.Views._Display, service.ViewModel);
        }
        else
        {
            return View(MVC.Courses.Course.Views.Display, service.ViewModel);
        }
    }

обратите внимание на создание службы в конструкторе контроллера и вызовы службы вдействия.

0 голосов
/ 04 марта 2011

1800 строк !!!!!!!!! Пресвятая Богородица. Я бы порекомендовал вам посмотреть следующее видео о том, как посадить контроллеры на диету.

...