RouteTable.Routes RouteCollection?
Пример, который я вижу везде для маршрутизации в стиле MVC, примерно такой:
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.Add(new Route
(
"Category/{action}/{categoryName}"
, new CategoryRouteHandler()
));
}
Какова причина переноса коллекции RouteTable.Routes в RegisterRoutes()? Почему не просто:
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes();
}
public static void RegisterRoutes()
{
RouteTable.Routes.Add(new Route
(
"Category/{action}/{categoryName}"
, new CategoryRouteHandler()
));
}
Что такое RouteCollection, кроме RouteTable.Routes, будет добавлен маршрут? Не является RouteTable.Routes RouteCollection для веб-приложения?
У меня есть определенный IRouteHandler с методом Map():
public class ChatRouteHandler : IRouteHandler
{
private static bool mapped;
public void Map()
{
if (!ChatRouteHandler.mapped)
{
RouteTable.Routes.Add
(
new Route("chat/{room}/{date}",
new ChatRouteHandler())
);
}
}
Есть ли причина, по которой Map() должен принимать RouteCollection и не добавлять в коллекцию RouteTable.Routes? Опять же, какой другой RouteCollection добавит этот IRouteHandler?
Ответы
Ответ 1
Тестирование модулей.
Отвязывая (через передачу аргументов) регистрацию с RouteTable.Routes, вы можете выбрать, какой RouteCollection используется для регистрации при модульном тестировании.
IMHO, лучше писать маршруты .Add() вместо RouteTable.Routes.Add() всюду.
"Есть ли причина, по которой Map() должен принимать RouteCollection и не добавлять в коллекцию RouteTable.Routes?"
Я интерпретирую этот вопрос как "Почему у RouteCollection нет метода MapRoute вместо метода расширения?".
Да, RouteCollection находится в System.WEb.Routing, в то время как метод расширения MapRoute находится в System.Web.Mvc. MapRoute() зависит от MvcHandler, о котором System.Web.Routing не знает.