ASP .Net MVC 3 HTTPContext Wrapper - PullRequest
3 голосов
/ 09 мая 2011

В попытке перейти на TDD и код, тестируемый модулем, я прочитал, что должен использовать оболочку HttpContext.В моем слое обслуживания, а также в контроллерах я должен получить доступ к сеансу HttpContext для некоторых данных, которые я там храню.

Может ли кто-нибудь предоставить пример реализации HttpContext Wrapper для MVC 3

1 Ответ

5 голосов
/ 24 мая 2011

Среда выполнения 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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...