【问题标题】:ASP.NET MVC: Is it good to access HttpContext in a controller?ASP.NET MVC:在控制器中访问 HttpContext 好吗?
【发布时间】:2012-04-07 10:35:18
【问题描述】:

我使用 ASP.NET(WebForm) 已经有一段时间了,但对 ASP.NET MVC 还是陌生的。从我读过的许多文章中,在大多数情况下,控制器难以测试的原因是因为它们正在访问运行时组件:HttpContext(包括请求、响应......)。在控制器中访问 HttpContext 似乎很糟糕。

但是,我必须在某个地方访问这些组件,从 Request 读取输入,通过 Response 发回结果,并使用 Session 保存一些状态变量。

如果我们不在控制器中访问这些运行时组件,那么访问这些运行时组件的最佳位置在哪里?

【问题讨论】:

    标签: asp.net-mvc unit-testing webforms


    【解决方案1】:

    当您在控制器中调用模型方法时,Request 和 Response 对象携带相同的值或输出到相同的源。 “页面”对这些对象来说很重要。

    还有一件事,RequestSessionResponse 对象可能不会在您的模型中直接引用,因此您可以使用 System.Web.HttpContext.Current 来获取对象。它们的功能与从控制器调用的相同。

    控制器是视图和模型之间的桥梁即使这些对象中没有任何响应或请求值,模型也应该可以工作,所以我会像往常一样使用这些对象的值来模拟方法的参数,而不是在模型中引用它们。这是 MVC 概念的正确用法。

    【讨论】:

    • 非常感谢!但我仍然没有得到答案,访问这些对象的最佳位置是哪里。
    • 我认为答案就在这些句子中。我会为你加粗。
    【解决方案2】:

    如果您确实必须从控制器访问这些对象,您总是可以将它们抽象出来并注入它们的模拟实例以将您的测试隔离到控制器。

    【讨论】:

      【解决方案3】:

      在 MVC 中,HttpContext 实际上是 HttpContextBase。直接使用这些类是完全可以的。如果您需要稍后测试您的控制器,您可以非常轻松地模拟这些类。

      http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx

      我认为你想做的事情没有错。

      在控制器中访问 HttpContext 似乎很糟糕。

      不,不是,它只是需要您考虑如何测试您的操作。如果你不测试,那么你可能甚至没有问题。不过我建议你测试一下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-27
        • 2011-10-22
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        相关资源
        最近更新 更多