Среда выполнения MVC уже предоставляет HttpContextWrapper . Вам необходимо реализовать обертку вокруг состояния Session и инкапсулировать тот факт, что к состоянию обращаются через HttpContext
, чтобы вы могли использовать DI или среду Mocking для создания SessionWrapper без поддержки HttpContext
для ваших тестов. Брэд Уилсон предоставляет некоторую полезную информацию о том, как это сделать . Однако, если вы не хотите просматривать видео (которое содержит сложные темы), вот суть для переноса сеанса:
Создайте интерфейс, представляющий строго типизированный объект, к которому вы обычно можете получить доступ через Session:
public interface ISessionWrapper
{
public UserPreferences CurrentUserPreferences{get;set;}
...
}
Создание реализации интерфейса, который использует Session в качестве резервного хранилища:
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>();