Книга: ASP.NET MVC Framework
Действия, фильтры и атрибуты
Переопределение свойства Actionlnvoker
После того как фабрика контроллеров создала контроллер, производится вызов его метода Execute
, который с помощью специального свойства ActionInvoker
определяет необходимый метод для выполнения действия и вызывает его. По умолчанию ActionInvoker
создается как экземпляр класса ControllerActionInvoker
, но разработчик волен переопределить его. Переопределение ActionInvoker
— это еще одна точка расширения ASP.NET MVC, которой вы можете воспользоваться для самых разнообразных целей. Например, т. к. именно ActionInvoker
исполняет все необходимые фильтры типа ActionFilter
, то вы вольны изменить этот механизм для того, чтобы часть фильтров не могла быть использована для ваших контроллеров в некотором гипотетическом случае.
По умолчанию метод InvokeAction
класса ActionInvoker
вместе с самим вызовом действия реализует механизм обработки заданных через атрибуты фильтров для действия.
Всего InvokeAction
формирует четыре группы фильтров:
? ActionFilters
— вызываются во время исполнения действия;
? ResultFilters
— вызываются после исполнения действия при обработке результата;
? AuthorizationFilters
— вызываются до исполнения действия, чтобы произвести проверку доступа;
? ExceptionFilters
— вызываются во время обработки возникшего исключения.
Существуют такие действия, скорость вызова которых критически важна. В связи с этим лишние операции по поиску и исполнению фильтров типа ActionFilter
могут отрицательно сказаться на производительности, даже когда никаких фильтров не используется. Поэтому создание своего варианта класса ActionInvoker
и метода InvokeAction
имеет смысл и может быть полезно. Вы можете реализовать InvokeAction
в таком виде, в котором и производительность будет на высоте, и необходимый функционал не будет потерян.
Для примера рассмотрим листинг 4.2 с реализацией такого класса ActionInvoker
, который максимально быстро вызывает действие контроллера без поддержки каких-либо атрибутов и накладных расходов на такую поддержку.
Листинг 4.2
public class FastControllerActionInvoker : ControllerActionInvoker
{
public override bool InvokeAction(
ControllerContext controllerContext, string actionName)
{
if (controllerContext == null)
throw new ArgumentNullException("controllerContext");
if (String.IsNullOrEmpty(actionName))
throw new ArgumentException("actionName");
ControllerDescriptor controllerDescriptor =
GetControllerDescriptor(controllerContext);
ActionDescriptor actionDescriptor = FindAction(controllerContext,
controllerDescriptor, actionName);
if (actionDescriptor != null)
{
IDictionary<string, object> parameters =
GetParameterValues(controllerContext, actionDescriptor);
var actionResult = InvokeActionMethod(controllerContext,
actionDescriptor, parameters);
InvokeActionResult(controllerContext, actionResult);
return true;
}
return false;
}
}
Существенное достоинство этого класса в том, что уменьшение затрат на вызов действия позволило ускорить вызов в среднем на величину от 5 до 30 % по разным оценкам проведенного нами тестирования. С другой стороны, данный вариант не поддерживает многие стандартные механизмы MVC: фильтры, обработку ошибок, проверку авторизации.
Для использования нового класса FastControllerActionInvoker
нужно присвоить его экземпляр свойству ActionInvoker
необходимого контроллера. Например, используем наш новый класс для контроллера AccountController
стандартного проекта MVC:
public AccountController()
: this(null, null)
{
ActionInvoker = new FastControllerActionInvoker();
}
- Последующие действия
- 4. Стадии бизнес-процесса взаимодействия с клиентами
- 1.3.5. Методы и атрибуты
- Неквалифицированные действия пользователей
- 2. Домены и атрибуты
- 4. Виртуальные атрибуты
- Фильтры и поиск
- 4.9 Обеспечение взаимодействия устройств Fibre Channel
- 7.3.1. Активные фильтры на ОУ
- 3.4. Арифметические действия
- 5.2.3. Действия с объектами Numbers
- У файла и каталога есть атрибуты (например: Скрытый, Только чтение). Как ими управлять из командной строки?