总是创建一个新的HttpContextWrapper是否安全?

问题描述:

我想通过使用一些ASP.NET MVC对象,特别是HttpContextWrapper,使现有的ASP.NET Web窗体应用程序更多的单元可测试。我见过它的用法的例子,他们总是创建一个新的对象。我使用Reflector反汇编源代码,并看到它所做的就是存储传递的HttpContext。但我很好奇是否总是创建一个HttpContextWrapper的新实例是安全的,还是按照某种方式遵循单例模式?下面是我用我的应用程序总是创建一个新的HttpContextWrapper是否安全?

public static class AppHttpContext { 
    public static HttpContextBase Current { get { return Getter(); } } 

    public static void SetContext(Func<HttpContextBase> getter) { 
     Getter = getter; 
    } 

    private static Func<HttpContextBase> Getter =() => new HttpContextWrapper(HttpContext.Current); 
} 

类我用它类似于HttpContext.Current

AppHttpContext.Current.Session["blah"] = "something"; 
+1

像这样的包装通常用来简单地将unmockable对象包装成可嘲弄的对象。这意味着他们的建设是微不足道的和不相关的。所以就去创建它们吧。 :) – bzlm 2010-10-22 13:23:56

AppHttpContext类是优秀的。它完美地提取了HttpContext并允许进行单元测试。使用HttpContextWrapper是安全的。作为一种改进,您可以将此类设置为非静态,而不是使用静态方法,您可以将委托注入到构造函数中。然后,所有需要使用上下文的类(通常只限于您的webform页面)可能需要一个AppHttpContext的实例。

+1

我相信他试图模仿现有的模型。 AppHttpContext.Current.Session [“blah”]'简单地替换'HttpContext.Current.Session [“blah”]'引用。你能否详细说明你的建议可能与代码和用法?我可能会误解它。 – 2010-10-21 19:08:00

+0

您可以给一些示例代码或任何解释代码的链接吗? – 2013-05-27 04:47:04

private readonly Func<HttpContextBase> _httpContext =() => 
    new HttpContextWrapper(HttpContext.Current);