2011-05-09 64 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>();