2009-03-30 3 views
11

El ejemplo que vemos en todas partes para el enrutamiento de estilo MVC es algo como esto:RouteTable.Routes RouteCollection?

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() 
    )); 
} 

¿Cuál es la razón para pasar a la colección RouteTable.Routes a RegisterRoutes()? ¿Por qué no simplemente:

void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(); 
} 

public static void RegisterRoutes() 
{ 
    RouteTable.Routes.Add(new Route 
    (
     "Category/{action}/{categoryName}" 
     , new CategoryRouteHandler() 
    )); 
} 

Lo RouteCollection además RouteTable.Routes se añadiría a una ruta? ¿No es RouteTable.Routes el RouteCollection para la aplicación web?

Tengo un IRouteHandler particular tiene un método de mapa():

public class ChatRouteHandler : IRouteHandler 
{ 
    private static bool mapped; 

    public void Map() 
    { 
     if (!ChatRouteHandler.mapped) 
     { 
      RouteTable.Routes.Add 
      (
       new Route("chat/{room}/{date}", 
       new ChatRouteHandler()) 
      ); 
     } 
    } 

¿Hay una razón por la que mapa() debe aceptar un RouteCollection y no agregar a la colección RouteTable.Routes? De nuevo, ¿a qué otra RouteCollection se agregaría este IRouteHandler?

Respuesta

13

Pruebas unitarias.

Al desacoplar (mediante el paso de argumentos) el registro de RouteTable.Routes puede elegir qué RouteCollection se utiliza para el registro en la prueba unitaria.

En mi humilde opinión, también es mejor escribir routes.Add() en lugar de RouteTable.Routes.Add() en todas partes.

"¿Hay alguna razón por la que Map() debería aceptar una RouteCollection y no agregarla a la colección RouteTable.Routes?"

Estoy interpretando esta pregunta como "¿Por qué RouteCollection no tiene el método MapRoute, en lugar de un método de extensión?". Sí, RouteCollection está en System.WEb.Routing, mientras que el método de extensión MapRoute está en System.Web.Mvc. MapRoute() depende de MvcHandler, del cual System.Web.Routing no tiene idea.

+0

Definitivamente puedo ver cómo esto podría afectar los diseños de clase. ¿Puede recomendar un ejemplo o una ilustración de pruebas unitarias para un RouteCollection o IRouteHandler? Después de todo, ¿no podría verse una prueba unitaria en RouteTable.Routes? – core

+1

Haacked tiene una buena demostración de prueba de unidad para las rutas. http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx En mi trabajo, un colega deriva RouteCollection para hacer algo similar. – CVertex

+0

Gracias por el enlace. Lo aprecio. En cuanto a Map(), estoy un poco confundido. ¿Hay un método de extensión Map() en MvcHandler o algo así? Soy completamente nuevo en MVC. – core

Cuestiones relacionadas