Книга: ASP.NET MVC Framework
Хранение маршрутов в базе данных
Хранение маршрутов в базе данных
Порой определение маршрутов в файле global.asax — это недостаточно гибкий механизм для решения задачи, встающей перед разработчиком. Допустим, стоит задача передать права на создание, редактирование и удаление маршрутов некоему администратору. В таком случае предоставление доступа на редактирование файла global.asax может нарушить безопасность системы. В подобных ситуациях и когда необходимо выделить механизм доступа к созданию и редактированию маршрутов, обычно создается отдельное хранилище для данных маршрутов, которое используется для инициализации механизма маршрутизации при старте приложения.
Таким хранилищем может быть любой источник данных: от текстовых файлов и XML до отдельной базы данных, в таблицах которой хранятся определения маршрутов. Рассмотрим создание такой базы данных для хранения простейших маршрутов.
Для начала определим две таблицы, Routeitem
и Param
, для хранения данных о маршрутах так, как продемонстрировано на рис. 6.1 и 6.2.
Таблица Routeitem
будет содержать информацию о маршрутах, а Param
— соответственно, о параметрах для каждого маршрута.
Чтобы добавить в проект поддержку этих таблиц, создадим с помощью мастера Linq To Sql классы для работы. Получившийся DBML-файл будет представлять схему, показанную на рис. 6.3.
После создания классов Linq To Sql настало время создать логику по регистрации маршрутов в механизме маршрутизации. Для этого создадим класс DatabaseRoutes
, представленный в листинге 6.2.
Листинг 6.2. Класс DatabaseRoutes
using System.Linq;
using System.Web.Mvc;
using System.Web.Routing;
namespace Routing {
public class DatabaseRoutes
{
readonly RouteDbDataContext db = new RouteDbDataContext();
private readonly RouteCollection Routes;
public DatabaseRoutes(RouteCollection routes)
{
Routes = routes;
}
public void Register()
{
var routes = db.RouteItems.Where(x => x.State).OrderBy(x => x.LoadOrder);
foreach (var route in routes)
{
RouteValueDictionary defaults = new RouteValueDictionary();
foreach (var param in route.Params)
defaults.Add(param.ParamKey, param.ParamValue);
Routes.Add(route.Name, new Route(
route.Template,
defaults,
new MvcRouteHandler()
));
}
}
}
}
Обратите внимание, конструктор-класс DatabaseRoute
принимает параметр типа RouteColection
, для того чтобы произвести регистрацию маршрутов. Единственный метод класса Register
предназначен для выборки данных из базы данных и инициализации механизма маршрутизации в виде полученного экземпляра RouteColection
.
Для того чтобы использовать наш класс, необходимо заполнить таблицы значениями. Сделаем это для определения стандартного маршрута Default
так, как представлено на рис. 6.4 и 6.5.
После того как данные внесены в базу данных, можно интегрировать механизм в проект. Для этого следует в global.asax удалить старое определение маршрута Default
и добавить инициализацию класса DatabaseRotes
так, как показано в следующем фрагменте кода:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
DatabaseRoutes dbRoutes = new DatabaseRoutes(routes);
dbRoutes.Register();
}
Если вы сделали все правильно, то результатом будет работа вашего проекта на основе маршрута, полученного из базы данных. Теперь, реализовав каким-либо образом доступ к базе данных маршрутов, вы получите возможность предоставить функции редактирования маршрутов администратору без модификации исходных кодов в виде global.asax.
Представленный пример предполагает реализацию хранения только простейших маршрутов. Для хранения данных об ограничениях, данных DataTokens
или данных игнорирования маршрутов механизм придется расширить, что не должно составить труда.
- Советы по использованию маршрутов
- Резервное копирование базы данных InterBase
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Владелец базы данных
- ЧАСТЬ IV. База данных и ее объекты.
- Сохранение информации о пользователях при миграции
- Перевод базы данных InterBase 6.x на 3-й диалект
- Типы данных для работы с датой и временем
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Обзор основных причин повреждения базы данных