Каков принятый шаблон для реализации Сессии в ASP.NET сайты MVC?

Очевидно, типичный подход WebForms не будет работать. Как каждый отслеживает пользователя в мире MVC?

5
задан AngryHacker 5 March 2010 в 23:19
поделиться

1 ответ

Сессия работает точно так же, как и в Webforms. Если вы хотите хранить простую информацию, используйте файл cookie проверки подлинности с помощью форм. Если вы хотите сохранить содержимое корзины покупок, вам лучше всего подойдет Session. Я написал в блоге запись о с использованием сеанса с ASP.NET :

Допустим, мы хотим сохранить целочисленную переменную в сеансе. Мы создадим оболочку вокруг переменной сеанса, которая сделает ее более привлекательной:

Сначала мы определяем интерфейс:

public interface ISessionWrapper
{
    int SomeInteger { get; set; }
}

Затем мы создаем реализацию HttpContext:

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 int SomeInteger
    {
        get { return GetFromSession<int>("SomeInteger"); }
        set { SetInSession("SomeInteger", value); }
    }
}

GetFromSession и SetInSession - вспомогательные методы, которые упрощают получение и установку данных в Session. Свойство SomeInteger использует эти методы.

Затем мы определяем наш базовый контроллер (применимый к ASP.NET MVC):

public class BaseController : Controller
{
    public ISessionWrapper SessionWrapper { get; set; }

    public BaseController()
    {
        SessionWrapper = new HttpContextSessionWrapper();
    }
}

Если вы хотите использовать Session вне контроллера, вы просто создаете или внедряете новый HttpContextSessionWrapper ().

Вы можете заменить SessionWrapper на ISessionWrapper mock в тестах контроллера, чтобы он больше не зависел от HttpContext. Session также более прост в использовании, потому что вместо вызова (int) Session ["SomeInteger"] вы вызываете SessionWrapper.SomeInteger. Выглядит лучше, правда?

Вас может соблазнить идея создания статического класса, охватывающего объект Session и не требующего определения каких-либо интерфейсов или инициализации в BaseController, но он теряет некоторые преимущества, особенно когда речь идет о тестировании и замене другими реализациями.

24
ответ дан 18 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: