2011-05-09 99 views
3

爲了轉向TDD和單元可測試代碼,我已經閱讀過我應該使用HttpContext包裝器。在我的服務層以及我的控制器中,我必須訪問HttpContext會話以獲取存儲在那裏的一些數據。ASP .Net MVC 3 HTTPContext Wrapper

有人能爲MVC 3

回答

5

的MVC運行時已經提供了HttpContextWrapper提供的HttpContext包裝實施的例子。你需要實現的是一個圍繞會話狀態的封裝,並且封裝了通過HttpContext訪問狀態的事實,這樣你就可以使用DI或Mocking框架爲你的測試創建一個非支持的SessionWrapper。 Brad Wilson provides some good information on how to do this。但是,如果你不想通過視頻(其中包含高級的主題)來趟這裏的用於包裝會議要點:

創建表示強類型對象的接口,你可以通過會話通常訪問:

public interface ISessionWrapper 
{ 
    public UserPreferences CurrentUserPreferences{get;set;} 
    ... 
} 

創建使用會話作爲後備存儲的接口的實現:

public class HttpContextSessionWrapper : ISessionWrapper 
{ 
    private T GetFromSession<T>(string key) 
    { 
     return (T) HttpContext.Current.Session[key]; 
    } 

    private void SetInSession(string key, object value) 
    { 
     HttpContext.Current.Session[key] = value; 
    } 

    public UserPreferences CurrentUserPreferences 
    { 
     get { return GetFromSession<UserPreferences>("CurrentUserPreferences"); } 
     set { SetInSession("CurrentUserPreferences", value); } 
    } 

    ... 
} 

解決該實例中您的Controller使用DependencyResolver(或者最好是通過您選擇的DI框架完成)。假設你在大多數控制器中使用SessionWrapper,這可以在一個共同的BaseController中完成:

var SessionWrapper = DependencyResolver.Current.GetService<ISessionWrapper>();