2009-03-30 1 views
11

L'exemple que je vois partout pour le routage de style MVC est quelque chose comme ceci: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() 
    )); 
} 

Quelle est la raison de passer la collection RouteTable.Routes à RegisterRoutes()? Pourquoi ne pas simplement:

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

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

En plus de RouteTable.Routes, quelle RouteCable serait ajoutée? RouteTable.Routes RouteCollection pour l'application Web?

J'ai un IRouteHandler particulier a une méthode 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()) 
      ); 
     } 
    } 

Y at-il une raison pour laquelle la carte() doit accepter un RouteCollection et ne pas ajouter à la collection RouteTable.Routes? Encore une fois, à quelle autre RouteCollection cet IRouteHandler serait-il ajouté?

Répondre

13

Tests unitaires. En découplant (par le passage d'arguments) l'enregistrement de RouteTable.Routes, vous pouvez choisir quelle RouteCollection est utilisée pour l'enregistrement dans les tests unitaires.

À mon humble avis, il est également plus agréable d'écrire des routes.Add() au lieu de RouteTable.Routes.Add() partout.

"Existe-t-il une raison pour que Map() accepte une RouteCollection et ne l'ajoute pas à la collection RouteTable.Routes?"

J'interprète cette question comme "Pourquoi RouteCollection n'a pas la méthode MapRoute, au lieu d'une méthode d'extension?". Oui, RouteCollection est dans System.WEb.Routing, tandis que la méthode d'extension MapRoute est dans System.Web.Mvc. MapRoute() dépend de MvcHandler, dont System.Web.Routing n'a aucune idée.

+0

Je peux vraiment voir comment cela pourrait affecter les conceptions de classe. Pouvez-vous recommander un exemple ou une illustration de test unitaire pour un RouteCollection ou IRouteHandler? Après tout, un test unitaire ne pouvait-il pas apparaître dans RouteTable.Routes? – core

+1

Haacked a une bonne démo de tests unitaires pour les routes. http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx Lors de mon travail, un collègue a dérivé RouteCollection pour faire quelque chose de similaire. – CVertex

+0

Merci pour le lien. Appréciez-le. En ce qui concerne Map(), je suis un peu confus. Y at-il une méthode d'extension Map() sur MvcHandler ou quelque chose? Je suis complètement nouveau à MVC. – core

Questions connexes