2010-10-21 79 views
4

我想通過使用一些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

回答

2

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

0
private readonly Func<HttpContextBase> _httpContext =() => 
    new HttpContextWrapper(HttpContext.Current); 
相關問題