2009-03-30 4 views
11

Das Beispiel, das ich überall sehen für MVC-Stil-Routing ist so etwas wie dieses: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() 
    )); 
} 

Was ist der Grund die RouteTable.Routes Sammlung RegisterRoutes() übergeben? Warum nicht einfach:

Welche RouteCollection neben RouteTable.Routes würde eine Route hinzugefügt werden? Ist RouteTable.Routes die RouteCollection für die Webanwendung nicht?

Ich habe einen besonderen IRouteHandler mit verfügt über eine Karte() Methode:

public class ChatRouteHandler : IRouteHandler 
{ 
    private static bool mapped; 

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

Gibt es einen Grund, dass Map() eine Routecollection akzeptieren sollte und nicht auf die RouteTable.Routes Sammlung? Welche andere RouteCollection würde diesem IRouteHandler hinzugefügt werden?

Antwort

13

Gerätetest.

Durch die Entkopplung (durch Argumentübergabe) Registrierung von RouteTable.Routes können Sie auswählen, welche RouteCollection für die Registrierung in Komponententests verwendet wird.

IMHO, es ist auch schöner, routes.Add() statt RouteTable.Routes.Add() überall zu schreiben.

"Gibt es einen Grund, dass Map() eine RouteCollection akzeptieren sollte und nicht zur RouteTable.Routes-Auflistung hinzufügen?"

Ich interpretiere diese Frage als "Warum hat RouteCollection nicht die MapRoute-Methode anstelle einer Erweiterungsmethode?". Yeah, RouteCollection befindet sich in System.Web.Routing, während sich die MapRoute-Erweiterungsmethode in System.Web.Mvc befindet. MapRoute() hängt von MvcHandler ab, von dem System.Web.Routing keine Ahnung hat.

+0

Ich kann definitiv sehen, wie dies Klassendesigns beeinflussen könnte. Können Sie ein Beispiel oder eine Illustration des Komponententests für eine RouteCollection oder IRouteHandler empfehlen? Könnte ein Unit-Test nicht in RouteTable.Routes aussehen? – core

+1

Haacked hat eine gute Testversion Demo für Routen. http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx Bei meiner Arbeit leitete ein Kollege RouteCollection, um etwas ähnliches zu tun. – CVertex

+0

Danke für den Link. Bin dankbar. Bezüglich Map() bin ich etwas verwirrt. Gibt es eine Map() - Erweiterungsmethode auf MvcHandler oder so? Ich bin komplett neu in MVC. – core

Verwandte Themen