Книга: 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.

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

Оглавление книги


Генерация: 1.310. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз