Использование сеанса ASP.NET MVC - PullRequest
2 голосов
/ 10 марта 2010

В настоящее время я использую ViewData или TempData для сохранения объектов в моем приложении ASP.NET MVC.

Однако в некоторых случаях, когда я сохраняю объекты в ViewData через мой базовый класс контроллера, я обращаюсь к базе данных при каждом запросе (когда ViewData ["what") == null).

Было бы хорошо сохранить их во что-то с большей продолжительностью жизни, а именно сессию. Аналогично, в конвейере обработки заказов я не хочу, чтобы такие вещи, как Order, сохранялись в базе данных при создании. Я бы предпочел заполнить объект в памяти, а затем, когда заказ достигнет определенного состояния, сохранить его.

Так что может показаться, что сессия - лучшее место для этого? Или вы бы порекомендовали в случае заказа извлекать заказ из базы данных по каждому запросу, а не с помощью сеанса?

Мысли, предложения приветствуются. Спасибо Ben

Ответы [ 3 ]

4 голосов
/ 11 марта 2010

Просто подумал, что поделюсь тем, как я использую сессию в своем приложении.Мне действительно нравится эта реализация ( Предложения по доступу к данным ASP.NET MVC Session [] в контроллерах и методах расширения? ) использования сеанса, поскольку она позволяет легко менять сеанс для другого хранилища или для целей тестирования.

Глядя на реализацию, она напомнила мне ObjectStore, который я использовал в других проектах для сериализации объектов в двоичном или XML-формате и хранения в базе данных или в файловой системе.

Поэтому я упростил свой интерфейс(ранее T должен был быть классом) и придумал следующее:

public interface IObjectStore {
    void Delete(string key);
    T Get<T>(string key);
    void Store<T>(string key, T value);
    IList<T> GetList<T>(string key);
}

И моя реализация хранилища сеансов:

public class SessionStore : IObjectStore
{      
    public void Delete(string key) {
        HttpContext.Current.Session.Remove(key);
    }

    public T Get<T>(string key) {
        return (T)HttpContext.Current.Session[key];
    }

    public void Store<T>(string key, T value) {
        HttpContext.Current.Session[key] = value;
    }

    public IList<T> GetList<T>(string key) {
        throw new NotImplementedException();
    }
}

Затем я беру IObjectStore в моем базовом контроллереконструктор и может затем использовать его, чтобы выставить свойства другим контроллерам:

   public string CurrentCustomer {
        get {
            string currentCustomer = 
                sessionStore.Get<string>(SessionKeys.CustomerSessionKey);
            if (currentCustomer == null) {
                currentCustomer = Guid.NewGuid().ToString();
                sessionStore.Store<string>(SessionKeys.CustomerSessionKey, currentCustomer);
            }
            return currentCustomer;               
        }
    }

Я очень доволен этим подходом.

2 голосов
/ 10 марта 2010

Я считаю, что это то, для чего был разработан Session - для временного хранения специфичных для сессии данных.

Однако из-за повышенной сложности, связанной с использованием сеанса, даже если она незначительна - в моем собственном проекте ASP.NET MVC я решил использовать базу данных на каждой странице шага создания заказа (между шагами передается только идентификатор) , Я готов оптимизировать и начать использовать сессию, как только увижу, что дополнительное попадание в базу данных для каждого запроса является узким местом в производительности.

1 голос
/ 10 марта 2010

Вы можете сериализовать то, что хотите сохранить, и поместить его в скрытое поле ввода, например ViewState в WebForms.

Вот статья, с которой стоит начать: http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...