Каковы хорошие кандидаты на базовый класс контроллера в ASP.NET MVC? - PullRequest
27 голосов
/ 25 мая 2011

Я видел много людей, которые говорили об использовании базовых контроллеров в своих проектах ASP.NET MVC. Типичные примеры, которые я видел, делают это для регистрации или, возможно, CRUD-леса. Каковы другие хорошие применения базового класса контроллера?

Ответы [ 9 ]

38 голосов
/ 25 мая 2011

Нет хорошего использования базового класса контроллера.

Теперь выслушай меня.

Asp.Net MVC, особенно MVC 3, имеет тонны хуков расширяемости, которые обеспечивают более свободный способ добавления функциональности ко всем контроллерам. Так как ваши классы контроллеров очень важны и важны для приложения, очень важно, чтобы они были легкими, гибкими и слабо связаны со всем остальным.

  • Инфраструктура ведения журнала принадлежит конструктор и должен быть введен через DI-фреймворк.

  • Строительные леса CRUD должны обрабатываться генерация кода или кастом ModelMetadata провайдера.

  • Глобальная обработка исключений должна быть обрабатывается пользовательским ActionInvoker.

  • Глобальный просмотр данных и авторизация должны обрабатываться фильтрами действий. Еще проще с глобальными фильтрами действий в MVC3.

  • Константы могут помещаться в другой класс / файл с именем ApplicationConstants или что-то в этом роде.

Базовые контроллеры обычно используются неопытными разработчиками MVC, которые не знают всех частей расширяемости MVC. Теперь не поймите меня неправильно, я не осуждаю и не работаю с людьми, которые используют их по всем неправильным причинам. Это просто опыт, который предоставляет вам больше инструментов для решения типичных проблем.

Я почти уверен, что нет ни одной проблемы, которую вы не можете решить с помощью другого хука расширяемости, кроме базового класса контроллера. Не принимайте наименьшую форму сцепления (наследования), если нет существенной причины производительности и вы не нарушаете Лискова. Я бы предпочел потратить <1 секунду, чтобы 20 раз набрать свойство для моих контроллеров, например <code>public ILogger Logger { get; set; }, чем ввести жесткую связь, которая влияет на приложение гораздо более значительными способами.

Даже что-то вроде userId или мультитенантного ключа может идти в ControllerFactory вместо базового контроллера. Стоимость соединения базового класса контроллеров просто не стоит.

8 голосов
/ 25 мая 2011

Мне нравится использовать базовый контроллер для авторизации.

Вместо того, чтобы украшать каждое действие атрибутом «Авторизация», я делаю авторизацию в базовом контроллере. Список авторизованных действий извлекается из базы данных для вошедшего в систему пользователя.

пожалуйста, прочитайте ссылку ниже для получения дополнительной информации об авторизации. Хорошая практика для выполнения общих авторизаций на фабрике пользовательских контроллеров?

3 голосов
/ 07 октября 2013

Я использовал базовый контроллер во многих своих проектах и ​​работал фантастически.Я в основном использовал для

  • Регистрация исключений
  • Уведомление (успех, ошибка, добавление ..)
  • Вызов обработки HTTP404
3 голосов
/ 25 мая 2011

Я использую его для доступа к сеансу, данным приложения и т. Д.

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

По сути, я использую это для вещей, которые я повторяю много

О, я должен упомянуть, что не использую его для логики бизнеса или доступа к базе данных. Думаю, константы - неплохая ставка для базового класса.

2 голосов
/ 25 мая 2011

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

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

1 голос
/ 14 августа 2013

Я использую базовый контроллер для интернационализации, используя библиотеку i18N . Он предоставляет метод, который я могу использовать для локализации любых строк в контроллере.

1 голос
/ 04 декабря 2012

Я использовал общий базовый класс контроллера для обработки:

  • Я создал BaseCRUDController<Key,Model>, для которого в качестве параметра конструктора требовался объект ICRUDService<TModel>, поэтому базовый класс будет обрабатывать Создать / Редактировать / Удалить . и обязательно в виртуальном режиме для обработки в пользовательских ситуациях
  • В ICRUDService<TModel> есть такие методы, как Сохранить / Обновление / Удалить / Найти / Сбросить / ... и я реализую его для каждого репозитория, который я создаю, чтобы добавить к нему больше функциональности.
  • Используя эту структуру, я мог бы добавить некоторые общие функции, такие как PagedList / Автозаполнение / ResetCache / IncOrder & DecOrder (если модель IOrderable )
  • Ошибка / Уведомление обработка сообщений: часть в макете с кодом @TempData["MHError"] и свойство в базовом контроллере, например

    ошибка публичного уведомления { set {TempData ["MHError"] = значение; } get {return (Notification) TempData.Peek ("MHError"); } }

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

1 голос
/ 25 мая 2011

Мы используем BaseController для двух вещей:

  1. Атрибуты, которые должны применяться ко всем контроллерам.
  2. Переопределение перенаправления, которое защищает от атак открытого перенаправления, проверяяURL перенаправления является локальным URL.Таким образом, все контроллеры, вызывающие Redirect, защищены.
0 голосов
/ 13 июня 2017

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

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