开发者

ASP.NET MVC Session usage

Currently I am using ViewData or TempData for object p开发者_开发技巧ersistance in my ASP.NET MVC application.

However in a few cases where I am storing objects into ViewData through my base controller class, I am hitting the database on every request (when ViewData["whatever"] == null).

It would be good to persist these into something with a longer lifespan, namely session. Similarly in an order processing pipeline, I don't want things like Order to be saved to the database on creation. I would rather populate the object in memory and then when the order gets to a certain state, save it.

So it would seem that session is the best place for this? Or would you recommend that in the case of order, to retrieve the order from the database on each request, rather than using session?

Thoughts, suggestions appreciated. Thanks Ben


Just thought I would share how I am using session in my application. I really like this implementation (Suggestions for Accessing ASP.NET MVC Session[] Data in Controllers and Extension Methods?) of using session as it makes it easy to swap out session for another store or for testing purposes.

Looking at the implementation it reminded me of the ObjectStore I have used in other projects to serialize objects as binary or xml and store in a database or on the filesystem.

I therefore simplified my interface (previously T had to be a class) and came up with the following:

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);
}

And my session store implementation:

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();
    }
}

I then take in an IObjectStore in my base controller's constructor and can then use it like so to expose properties to my other controllers:

   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;               
        }
    }

Am quite pleased with this approach.


I believe this is what Session was designed for - to temporarily store session specific data.

However, due to increased complexity connected with using the Session, even if negligible - in my own ASP.NET MVC project, I have decided to hit the database on every Order creation step page (only ID is passed between the steps). I am ready to optimize and start using session as soon as I will see that the extra database hit for every request is a performance bottleneck.


You can serialize what you wish to persist and place it in a hidden input field like ViewState in WebForms.

Here's an article that should get you started: http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜