为了转向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>();