Книга: ASP.NET MVC Framework
Наследование контроллеров
Наследование контроллеров
При работе с контроллерами в MVC Framework полезной практикой является механизм наследования контроллеров. Так как контроллеры представляют собой классы, преимущества наследования контроллеров схожи с преимуществами наследования классов в C#. Основным таким преимуществом является возможность создания базового набора правил для некоторого количества контроллеров. Для этого в MVC Framework можно определить контроллер, который будет называться базовым, и наследовать все остальные контроллеры от него.
Далее перечислены примеры возможных функций базовых контроллеров:
? хранение и предоставление информации о текущем пользователе и его правах;
? предоставление информации о базовых настройках приложения, которые могут поставляться, например, из web.config;
? экземпляры хранилищ кода для работы с разнообразным функционалом: от пользователей до специфических данных приложения;
? вспомогательные статические или другие методы утилитарного характера;
? определение набора атрибутов, которые будут наследовать потомки базового контроллера.
Рассмотрим простейший пример базового контроллера. Для этого определим для него набор функционала: обработку ошибок, GZip-сжатие результатов действий, вспомогательную функцию для работы с пользователем и загрузчик некоторых параметров из файла web.config.
Листинг 4.7. Базовый контроллер
[HandleError(View = "AdminError")]
[GZipCompress]
public class BaseController : Controller
{
public NameValueCollection Settings
{
get
{
return ConfigurationManager.AppSettings;
}
}
public string UserNotFoundMessage
{
get
{
return Settings["userNotFoundMessage"];
}
}
public readonly MembershipProvider MP = Membership.Provider;
public virtual ActionResult Index()
{
return View();
}
public static MembershipUser GetUser(string userName)
{
MembershipProvider mp = Membership.Provider;
return mp.GetUser(userName, false);
}
public static MembershipUser GetUser(Guid userId)
{
MembershipProvider mp = Membership.Provider;
return mp.GetUser(userId, false);
}
}
Базовый контроллер из листинга 4.7 обладает следующими свойствами:
? определяет для контроллера действие по умолчанию Index
;
? определяет атрибуты по умолчанию для обработки ошибок и сжатия результатов через GZip;
? определяет обертку Settings
над секцией настроек appSettings
файла web.config, для более прозрачного доступа к настройкам;
? прямо определяет UserNotFoundMessage
, одну из настроек секции appSettings
для быстрого к ней доступа;
? определяет упрощенный доступ к объекту Membership.Provider
;
? определяет статический метод для более простого доступа к данным пользователей.
Чтобы наделить этими свойствами любой контроллер, необходимо наследовать его от базового. Модифицируем контроллер AdminController
согласно новым правилам так, как показано во фрагменте:
public class AdminController : BaseController {
[AcceptVerbs(HttpVerbs.Get)]
[Authorize(Users = "Admin")]
public override ActionResult Index()
{
int userCount;
var users = MP.GetAllUsers(0, Int32.MaxValue, out userCount);
ViewData.Model = users;
return View();
}
[AcceptVerbs(HttpVerbs.Get)]
[Authorize(Users = "Admin")]
public ActionResult Select(Guid? userId)
{
if (!userId.HasValue)
throw new HttpException(404, UserNotFoundMessage);
return View("Select", "Site", GetUser(userId.Value));
}
}
Обратите внимание, класс контроллера наследует BaseController
, в связи с этим действие Index
переопределяется с помощью ключевого слова override
. Кроме того, в Index
используется новое свойство mp, определенное в базовом контроллере. В другом действии, Select
, используются два других функционала базового контроллера: свойство UserNotFoundMessage
и статический метод GetUser
.
Использование базовых контроллеров позволяет гибко определять базовую логику для других контроллеров. Создав однажды базовый контроллер с набором функций, впоследствии, при создании других контроллеров, вы можете наследовать эти функции, просто определяя базовый контроллер для каждого нового контроллера.
- У14.4 Наследование без классов
- Наследование
- Лекция 9. Наследование и замыкание
- Лекция 14. Введение в наследование
- Лекция 15. Множественное наследование
- Дублируемое наследование
- ГЛАВА 11 Наследование
- Единичное наследование (single inheritance)
- Множественное наследование (Multiple inheritance)
- Дублируемое наследование (Repeated inheritance)
- У3.6 Управление конфигурацией и наследование
- Наследование функциональных возможностей общего характера