В этом и следующий статьи ставят точки в ответе на вопрос «Как работает MVC FrameworkЭ»
Это продолжение серии заметок о ASP.NET MVC Framework. Начало было положено в предыдущая статья , что подняло вопрос о необходимости перехода на MVC Framework. После появления комментариев стало очевидно, что статья написана не зря, поскольку определенная часть читателей не понимает смысла и разницы между двумя подходами: классическим ASP.NET и MVC Framework. Надеюсь, вопросы, поднятые в первой главе, заставили кого-то задуматься.
На этот раз мы поговорим о том, как работает механизм MVC Framework изнутри.
Уже на Хабрахабре публикация по этому поводу, но я постараюсь дать более подробное описание и коснуться механизмов, которые не были упомянуты в той статье.
Обработка и маршрутизация запросов
Механизм маршрутизации ASP.NET — важный элемент работы MVC Framework. В стандартной версии при поступлении первого запроса на приложение и создании приложения в файле Global.asax с помощью метода Начало_приложения инициализируются маршруты, определенные разработчиком.Строго говоря, обработкой запросов занимаются механизмы, которые нельзя назвать неотъемлемой частью MVC Framework. Обработка запроса поручена Модуль URLRoutingModule — это класс, реализующий IHttpModule, определенный в проектах MVC Framework как модуль, обрабатывающий http-запросы.
UrlRoutingModule, как механизм маршрутизации, является стандартной частью ASP.NET и его вполне можно использовать вне MVC Framework. Если рассматривать UrlRoutingModule в контексте MVC Framework, то его задачей становится создание и инициализация объекта типа Контекст запроса , который, в свою очередь, используется механизмом MVC. В упрощенном виде схема обработки запроса представляет собой следующую последовательность действий: UrlRoutingModule обрабатывает запрос и выбирает на его основе первый подходящий маршрут из набора маршрутов, определенного разработчиком; UrlRoutingModule, на основе маршрута, представленного объектом типа Маршрут , создает объект типа RequestContext. RequestContext содержит данные о контексте выполнения запроса и данные о текущем маршруте; в MVC Framework каждый маршрут по умолчанию связан с обработчиком маршрута в форме объекта MVCRouteHandler , который обычно создает и возвращает экземпляр класса МВЧандлер , которому передается ранее созданный объект RequestContext; MVCHandler делает последний шаг: создает фабрику контроллеров и использует ее для получения объекта контроллера MVC Framework, необходимого для продолжения обработки запроса.
Таким образом, контроллер создается в ответ на запрос пользователя.
Давайте подробнее рассмотрим создание контроллеров.
Завод контроллеров
Фабрика контроллеров — это механизм, задачей которого является создание экземпляров классов контроллеров на основе передаваемой информации в виде имени контроллера и объекта типа RequestContext. Фабрика контроллера должна реализовать интерфейс IControllerFactory .Но в целом нет необходимости определять собственную фабрику контроллеров, поскольку в MVC Framework есть класс ДефолтФакториконтроллер , который является фабрикой контроллера по умолчанию.
MVC Framework использует метод Создатьконтроллер фабрики контроллеров для получения объекта типа IController .
На этом этап создания контроллера завершен и вызывается его метод Выполнять , которому передается параметр в форме RequestContext. На этапе фабрики контроллера есть прекрасная возможность расширить функциональность, что показывает, насколько расширяема MVC Framework. Вы можете определить свой собственный класс фабрики контроллера, унаследовав его от класса DefaultFactoryController. Затем, переопределив метод GetControllerInstance в своем классе, вы сможете определить в нем свою логику создания контроллеров.
Чтобы зарегистрировать фабрику контроллера, вы можете добавить следующий код в метод Application_Start файла Global.asax: ControllerBuilder.Current.SetControllerFactory(новый ControllerFactory()); Зачем вам может понадобиться создать собственную фабрику контроллеров? Одним из наиболее распространенных вариантов является реализация механизма IoC/DI для создания экземпляров контроллеров с использованием, например, DI-контейнера.
Блоки приложений Unity .
Итак, контроллер создан и вызван его метод Execute. Что дальше?
ActionInvoker
И тогда в дело вступает механизм ActionInvoker , цель которого — узнать, какой метод класса контроллера необходимо выполнить в ответ на запрос пользователя.ActionInvoker — это свойство класса Controller, который обычно является производным от всех контроллеров в MVC Framework. ActionInvoker — это объект класса КонтроллерДействиеИнвокер .
Его важной частью является метод ВызовДействие , который ищет нужный метод класса контроллера, вызывает его и выполняет результат. Для работы метод InvokeAction принимает параметры контекста контроллера и имя действия, которое необходимо найти.
Хотя поиск класса метода по имени тривиален, существует несколько важных проблем, влияющих на результаты поиска.
Следующие четыре группы атрибутов влияют на процесс выполнения действия и его результат: атрибуты, полученные из Атрибут ActionMethodSelector может влиять на выбор метода для выполнения в зависимости от контекст запроса .
MVC Framework имеет два таких стандартных атрибута: AcceptVerbsAttribute И Нонэкшнатрибут ; атрибуты, полученные из Атрибут ActionNameSelector может влиять на выбор метода для выполнения в зависимости от название действия , который необходимо выполнить.
MVC Framework имеет один такой атрибут — ИмяДействияАтрибут ; атрибуты, полученные из ФильтрАтрибут — это так называемые механизмы фильтрации, позволяющие более гибко контролировать процесс выполнения действия.
Эти фильтры предназначены либо для ограничения выполнения действия по каким-либо причинам, либо для обработки исключений, возникающих во время выполнения.
Стандартными реализациями этих фильтров являются атрибуты.
AuthorizeAttribute, HandleErrorAttibute, ValidateAntiForgeryTokenAttribute и ValidateInputAttribute ; еще один атрибут Атрибут ActionFilter , производный от FilterAttribute, позволяет создать механизм, который будет вызываться в четырех ключевых местах выполнения действия: перед выполнением, после выполнения, перед выполнением результата и после выполнения результата.
Реализация данного атрибута позволит более гибко влиять на процесс выполнения действия и результат, отслеживать его и управлять им.
В MVC Framework есть один атрибут, производный от ActionFilterAttribute — это Выходной кэшатрибуте .
Если вы все это прочитали и ничего не поняли, то подождите немного, в следующих статьях я постараюсь описать каждый из атрибутов подробнее.
А пока продолжим рассматривать, как работает механизм ActionInvoker. Согласно архитектуре MVC Framework, вы можете заменить каждую ее часть своей.
ActionInvoker, как и все описанные выше атрибуты, не обошел этот принцип.
Вы можете определить свой собственный ActionInvoker; для этого вам просто нужно реализовать класс, наследуемый от класса ControllerActionInvoker, и переопределить метод InvokeAction. Это переопределение позволит вам создать собственный механизм поиска метода, его выполнения и обработки результата.
Чтобы зарегистрировать собственную версию ActionInvoker, просто назначьте его экземпляр свойству контроллера: общедоступный Контроллер Аккаунта() : это(ноль, ноль) { ActionInvoker = новый FastControllerActionInvoker(); } После того как ActionInvoker определил, какой метод нужно вызвать, в дело вступает механизм Привязка модели , который предназначен для сопоставления параметров клиентского запроса с параметрами метода действия.
В связи с тем, что материал слишком большой, механизм привязки модели, а также завершение описания механизма и всех этих атрибутов будут представлены в следующих статьях.
NET #ASP.NET #asp.net mvc #.
NET
-
37 Источников Идей Для Тестов
19 Oct, 24 -
Система Для Большой Науки
19 Oct, 24