1

我在解释MVC的请求生命周期时听到了下面这句话。

当 UrlRoutingModule 拦截一个请求时,该模块做的第一件事就是将当前的 HttpContext 包装在一个 HttpContextWrapper2 对象中。

包装 HttpContext 有什么意义?

该模块将包装的 HttpContext 传递给 RouteTable。HttpContext 包括与当前请求关联的 URL、表单参数、查询字符串参数和 cookie。如果当前请求与 Route Table 中的 Route 对象之一匹配,则返回 RouteData 对象。

如果 UrlRoutingModule 成功检索到 RouteData 对象,则模块接下来会创建 RouteContext 对象

RouteContext 是什么意思?

我在谷歌上搜索了很多,但找不到任何参考。

4

2 回答 2

2

我相信主要原因是为了方便单元测试。

HttpContextWrapper2继承自HttpContextBasewhich 是具有与 . 相同成员的抽象类HttpContext。MVC 类型将属性公开为HttpContextBase而不是HttpContext(例如Controller.HttpContext)),这意味着单元测试可以使用在 ASP.NET 管道之外运行的具体派生类,从而促进单元测试。

你能给出一个代码示例或任何链接吗?

这篇关于单元测试 MVC 的 MSDN 文章中:

在传统的 ASP.NET 中,开发人员在测试期间遇到的障碍之一是在每个请求期间使用过多的静态类。ASP.NET MVC 团队决定包装许多 .NET 静态帮助程序类(例如 HttpContext 和 HttpRequest),以便在测试期间可以用存根替换它们。ASP.NET MVC 提供了许多抽象来帮助开发人员避免使用这些类,但在需要使用它们的地方,包装器使此代码更易于测试。

ASP.NET MVC 文档有点薄,为了深入了解,我推荐“Pro ASP.NET MVC4 Framework”一书。

于 2013-05-22T17:49:23.217 回答
0

如果您要引用来源,那么您的句子来自:

当 UrlRoutingModule 拦截一个请求时,该模块做的第一件事就是将当前的 HttpContext 包装在一个 HttpContextWrapper2 对象中。与普通的 HttpContext 类不同,HttpContextWrapper2 类派生自 HttpContextBase 类。当您使用诸如 Typemock Isolator 或 Rhino Mocks 之类的 Mock Object Framework 时,为 HttpContext 创建包装器可以更轻松地模拟类。

于 2013-05-22T18:15:49.537 回答