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