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

Каковы хорошие кандидаты на базовый класс контроллера в ASP.NET MVC?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

  • Ведение журнала исключений
  • Уведомление (успех, ошибка, добавление..)
  • Вызов обработки ошибок HTTP404

Ответ 6

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

  • Атрибуты, которые должны применяться ко всем контроллерам.
  • Переопределение перенаправления, которое защищает от атак открытого перенаправления, проверяя, что URL-адрес перенаправления является локальным URL-адресом. Таким образом, все контроллеры, вызывающие перенаправление, защищены.

Ответ 7

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

Ответ 8

Что я сделал, так это использовать общий класс базового контроллера:

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

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

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

Ответ 9

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