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

RouteTable.Routes除了路由之外还会添加什么RouteCollection?不是RouteTable.Routes  Web应用程序的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集合?再次,这个IRouteHandler会添加什么其他RouteCollection?


10330
2018-03-30 04:30


起源



答案:


单元测试。

通过从RouteTable.Routes中解耦(通过参数传递)注册,您可以选择在单元测试中使用哪个RouteCollection进行注册。

恕我直言,编写routes.Add()而不是RouteTable.Routes.Add()到处都更好。

“是否有理由认为Map()应该接受RouteCollection而不是添加到RouteTable.Routes集合?”

我正在将这个问题解释为“为什么RouteCollection没有MapRoute方法,而不是扩展方法?”。 是的,RouteCollection在System.WEb.Routing中,而MapRoute扩展方法在System.Web.Mvc中。 MapRoute()依赖于MvcHandler,System.Web.Routing不知道。


13
2018-03-30 04:37



我可以肯定地看到这会如何影响课堂设计。您能为RouteCollection或IRouteHandler推荐单元测试的示例或说明吗?毕竟,在RouteTable.Routes中无法进行单元测试吗? - core
Haacked有一个很好的路线单元测试演示。 haacked.com/archive/2007/12/17/... 在我的工作中,一位同事派生出RouteCollection来做类似的事情。 - CVertex
谢谢你的链接。欣赏它。关于Map(),我有点困惑。 MvcHandler上有Map()扩展方法吗?我是MVC的新手。 - core
RouteCollection的MapRoute扩展方法驻留在System.Web.Mvc程序集中。这是添加路线的一种很好的快捷方式。所有示例/教程都使用MapRoute。 - CVertex
此外,如果您是非n00b到C#,请从aspnet.codeplex.com下载源代码并浏览。通过查看代码,可以非常容易地理解整个框架 - CVertex


答案:


单元测试。

通过从RouteTable.Routes中解耦(通过参数传递)注册,您可以选择在单元测试中使用哪个RouteCollection进行注册。

恕我直言,编写routes.Add()而不是RouteTable.Routes.Add()到处都更好。

“是否有理由认为Map()应该接受RouteCollection而不是添加到RouteTable.Routes集合?”

我正在将这个问题解释为“为什么RouteCollection没有MapRoute方法,而不是扩展方法?”。 是的,RouteCollection在System.WEb.Routing中,而MapRoute扩展方法在System.Web.Mvc中。 MapRoute()依赖于MvcHandler,System.Web.Routing不知道。


13
2018-03-30 04:37



我可以肯定地看到这会如何影响课堂设计。您能为RouteCollection或IRouteHandler推荐单元测试的示例或说明吗?毕竟,在RouteTable.Routes中无法进行单元测试吗? - core
Haacked有一个很好的路线单元测试演示。 haacked.com/archive/2007/12/17/... 在我的工作中,一位同事派生出RouteCollection来做类似的事情。 - CVertex
谢谢你的链接。欣赏它。关于Map(),我有点困惑。 MvcHandler上有Map()扩展方法吗?我是MVC的新手。 - core
RouteCollection的MapRoute扩展方法驻留在System.Web.Mvc程序集中。这是添加路线的一种很好的快捷方式。所有示例/教程都使用MapRoute。 - CVertex
此外,如果您是非n00b到C#,请从aspnet.codeplex.com下载源代码并浏览。通过查看代码,可以非常容易地理解整个框架 - CVertex