Чтение онлайн

на главную - закладки

Жанры

Шрифт:

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

Фабрика контроллеров в ASP.NET реализует интерфейс IControllerFactory, который содержит всего два метода:

public interface IControllerFactory {

IController CreateController(RequestContext requestContext,

string controllerName);

void ReleaseController(IController controller);

}

Здесь CreateController

должен создавать экземпляр контроллера, а ReleaseController — разрушать его или проводить какие-то другие действия после завершения работы контроллера. Вы можете создать свою фабрику контроллеров, реализовав этот интерфейс. Но более простым способом расширения фабрики является ее реализация с помощью наследования от класса DefaultFactoryController.

Для примера рассмотрим такую, вполне возможную задачу, решить которую позволит фабрика контроллеров:

? необходимо создать механизм, который позволит ограничивать создание определенных контроллеров на основе "черного списка";

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

? решение на базе маршрутов не может нас удовлетворить в связи с тем, что у нас много универсальных маршрутов, которые затрагивают сразу много контроллеров;

? требуется возможность работать с "черным списком" в виде редактирования определенного файла для возможности разделения и предоставления прав к нему.

Согласно этим требованиям создадим фабрику контроллеров, которая позволит нам ограничивать выполнение контроллеров по их именам через XML-файл "черного списка". Вот пример такого файла:

<?xml version="1.0" encoding="utf-8" ?>

<blacklist>

<item typeName="AccountController" />

<item typeName="AdminController" />

</blacklist>

Как можно увидеть, данным файлом мы хотели бы заблокировать выполнение контроллеров AccountController и AdminController.

Реализуем фабрику контроллеров, наследуя класс DefaultFactoryController:

public class ControllerFactory : DefaultControllerFactory {

protected override IController

GetControllerInstance(Type controllerType)

{

if (controllerType == null)

return base.GetControllerInstance(controllerType);

XmlDocument xdoc = new XmlDocument;

string blacklistPath =

HttpContext.Current.Server.MapPath("~/blacklist.xml");

xdoc.Load(blacklistPath);

XmlNodeList nodes = xdoc.GetElementsByTagName("blacklist");

foreach (XmlNode node in nodes[0].ChildNodes)

{

if (node.Attributes["typeName"].Value == controllerType.Name)

throw new HttpException(404, "Страница

не найдена");

}

return base.GetControllerInstance(controllerType);

}

}

Как вы можете видеть, единственным методом нашего класса является реализация перегруженного метода GetControllerInstance класса DefaultControllerFactory. В нем мы реализуем следующую последовательность действий:

1. Проверяем, не передается ли в фабрику контроллера типа контроллера в виде null, если это так, то завершаем выполнение вызовом базового метода для выполнения действия по умолчанию.

2. Загружаем наш XML-файл с "черным списком" и ищем в нем имя типа контроллера, который запрошен для создания.

3. Если в "черном списке" существует запись о блокировании данного контроллера, то возвращаем ответ на запрос в виде 404 ошибки HTTP "Страница не найдена".

4. Если контроллер отсутствует в "черном списке", то мы выполняем базовое действие по умолчанию для поиска и создания необходимого контроллера.

Для того чтобы наш код заработал, мы должны зарегистрировать нашу фабрику контроллеров. Функцию регистрации выполняет метод SetControllerFactory класса controllerBuilder. Добавим его вызов в файл Global.asax:

protected void Application_Start

{

RegisterRoutes(RouteTable.Routes);

ControllerBuilder.Current.SetControllerFactory( new ControllerFactory);

}

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

Другим, пожалуй, самым распространенным вариантом использования фабрики контроллеров является реализация архитектурного паттерна Инверсия контроля (Inversion of Control), который в данном применении позволяет в приложении уменьшить зависимость и ослабить связи между контроллерами. Для реализации такого механизма используются сторонние библиотеки, вроде Unity Application Blocks от Microsoft, Spring.NET или Ninject.

Поделиться:
Популярные книги

"Фантастика 2025-106" Компиляция. Книги 1-15

Александрова Марина
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
альтернативная история
постапокалипсис
фэнтези
5.00
рейтинг книги
Фантастика 2025-106 Компиляция. Книги 1-15

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Записки брюнетки

Голубицкая Жанна
Проза:
современная проза
4.25
рейтинг книги
Записки брюнетки

Поздний бунт. Андрей Старицкий

Ананьев Геннадий Андреевич
Рюриковичи
Проза:
историческая проза
5.00
рейтинг книги
Поздний бунт. Андрей Старицкий

Родовая магия

Layna
Проект «Поттер-Фанфикшн»
Фантастика:
фэнтези
5.00
рейтинг книги
Родовая магия

Вкусивший плоти Ангела

Пен-Пен
1. Трикстер
Фантастика:
боевая фантастика
8.20
рейтинг книги
Вкусивший плоти Ангела

Звезды над Самаркандом

Бородин Сергей Петрович
Проза:
историческая проза
7.50
рейтинг книги
Звезды над Самаркандом

Божественная комедия (илл. Доре)

Алигьери Данте
Старинная литература:
европейская старинная литература
7.62
рейтинг книги
Божественная комедия (илл. Доре)

Энциклопедия философских наук. Часть первая. Логика

Гегель Георг Вильгельм Фридрих
1. Собрание сочинений в 14 томах
Научно-образовательная:
философия
5.00
рейтинг книги
Энциклопедия философских наук. Часть первая. Логика

Евангельское злато. Беседы на Евангелие

Войно-Ясенецкий Архиепископ Лука
Религия и эзотерика:
религия
христианство
православие
5.00
рейтинг книги
Евангельское злато. Беседы на Евангелие

Гарри Поттер и Обитель Бессмертия

akchiskosan
Проект «Поттер-Фанфикшн»
Приключения:
прочие приключения
6.43
рейтинг книги
Гарри Поттер и Обитель Бессмертия

Том 9. По экватору. Таинственный незнакомец

Твен Марк
Проза:
классическая проза
6.25
рейтинг книги
Том 9. По экватору. Таинственный незнакомец

Мусаси

Ёсикава Эйдзи
Исторический роман
Фантастика:
фэнтези
6.25
рейтинг книги
Мусаси

История россии 1917–2009

Вдовин Александр Иванович
Научно-образовательная:
история
6.25
рейтинг книги
История россии 1917–2009