将当前HttpContext包装在HttpContextWrapper2对象中有什么好处?

时间:2013-05-22 16:13:23

标签: asp.net-mvc

我在解释MVC的生命周期请求时听到了以下句子。

  

当UrlRoutingModule拦截请求时,第一件事就是   模块的作用是将当前的HttpContext包装成一个   HttpContextWrapper2对象。

包装HttpContext有什么意义?

  

模块将包装好的HttpContext传递给RouteTable。该   HttpContext包括URL,表单参数,查询字符串   参数以及与当前请求关联的cookie。如果一个   可以在当前请求和其中一个路由之间进行匹配   路由表中的对象,然后返回一个RouteData对象。

     

如果UrlRoutingModule成功检索到RouteData对象   模块接下来创建一个RouteContext对象

RouteContext是什么意思?

我在google上搜索过很多但是找不到任何参考资料。

2 个答案:

答案 0 :(得分:2)

我认为主要原因是为了便于单元测试。

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

  

您可以提供代码示例或任何链接吗?

来自this MSDN article的单元测试MVC:

  

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

ASP.NET MVC文档在实际上有点薄,为了深入理解,我建议使用“Pro ASP.NET MVC4 Framework”一书。

答案 1 :(得分:0)

如果你cite the source你得到了以下句子:

  

当UrlRoutingModule拦截请求时,模块所做的第一件事就是将当前的HttpContext包装在HttpContextWrapper2对象中。 与普通的HttpContext类不同,HttpContextWrapper2类派生自HttpContextBase类。在使用模拟对象框架(如Typemock Isolator或Rhino Mocks)时,为HttpContext创建包装器可以更容易地模拟类。