目前我在ASP.NET MVC应用程序中使用ViewData或TempData作为对象持久性。
然而,在我通过我的基本控制器类将对象存储到ViewData的少数情况下,我在每次请求时都会访问数据库(当ViewData [“whatever”] == null时)。
将这些内容持续到具有更长寿命的东西(即会话)会很好。类似地,在订单处理管道中,我不希望在创建时将Order之类的东西保存到数据库中。我宁愿在内存中填充对象,然后当订单进入某个状态时,保存它。
所以会议似乎是最好的地方吗?或者你会建议在订单的情况下,在每个请求中从数据库中检索订单,而不是使用会话吗?
思考,建议表示赞赏。 谢谢 本
答案 0 :(得分:4)
以为我会分享我在我的应用程序中使用session的方式。我非常喜欢使用会话的这种实现(Suggestions for Accessing ASP.NET MVC Session[] Data in Controllers and Extension Methods?),因为它可以轻松地将会话替换为另一个商店或用于测试目的。
查看实现,它让我想起了我在其他项目中使用的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;
}
}
对这种方法非常满意。
答案 1 :(得分:2)
我相信这就是Session的目的 - 临时存储会话特定数据。
然而,由于与使用Session相关的复杂性增加,即使可以忽略不计 - 在我自己的ASP.NET MVC项目中,我决定在每个订单创建步骤页面上访问数据库(仅在步骤之间传递ID) 。我准备优化并开始使用会话,因为我会发现每个请求的额外数据库命中都是性能瓶颈。
答案 2 :(得分:1)
您可以序列化您希望保留的内容并将其放在隐藏的输入字段中,例如WebForms中的ViewState。
以下是一篇可以帮助您入门的文章:http://weblogs.asp.net/shijuvarghese/archive/2010/03/06/persisting-model-state-in-asp-net-mvc-using-html-serialize.aspx