2013-04-17 38 views
0

在我的AppStart.cshtml中,我从数据库中获取一些数据,进行计算,序列化/反序列化json字符串等,然后通过执行类似的操作将结果存储在一对AppState变量中以下内容:(C#)在AppState和Session中存储数据

AppState["myVar1"]="aString"; 
AppState["myVar2"]=anArray; 

这些变量被频繁访问,是一个有点重来定义,所以我认为像这样的意义,而不是从头开始创建每一个需要它的时候的数据。即使不需要优化,它仍然对我有意义,因为它通过在需要数据的一堆地方没有相同的代码来提高可读性和明确的可维护性。

同样,我通过在用户登录时将数据放入会话中来按用户进行类似的操作,例如,

Session["userVar1"]="myString"; 
Session["userVar2"]=myAray; 

不过,我刚才读的,我们永远不应该依赖于存储在这些数据仍然存在,当我们想读他们,因为他们存储在其中可能已经清除了服务器内存。 这是真的吗? 所以当我们想要访问其中的一个时,我们应该首先检查它是否为空?如果我们幸运的话,它不是空的,我们可以马上使用它,否则我们再次设置它。 这是应该如何使用存储在AppState和Session中的数据?如果是这样,如果它们为空,重新设置它们的好方法是什么?我想做一些创建一个函数来设置它们,如果它们为空?

回答

1

就你而言,如果数据偶尔会被服务器清除(例如,从IIS重新启动应用进程),听起来好像没问题,因为你描述的只是一个缓存场景。缓存数据本质上是暂时的。如果它在那里,请使用它。如果它不存在,请重新获取它(并再次使用结果填充缓存)。

我建议从缓存本身的结构中抽象出缓存机制(应用状态和会话状态)。在这个结构中,你可以检查数据是否被缓存,如果没有,则重新缓存它。考虑这样一个对象:

public class CacheManager 
{ 
    public static string MyString 
    { 
     get 
     { 
      if (string.IsNullOrWhiteSpace(AppState["myVar1"])) 
      { 
       // Fetch the value to be cached and set it in AppState["myVar1"] 
      } 
      return AppState["myVar1"]; 
     } 
    } 
} 

现在随时随地在你的应用程序,你可以通过调用获得的价值:

CacheManager.MyString 

应用程序的其余部分不知道或不关心,如果从应用程序状态的,或会话状态,或数据库,文件或任何其他瞬态位置缓存数据。这完全由缓存管理器对象处理。所以如果你想改变某些值的位置,你可以在那个地方改变它们。或者,如果出于测试目的,您希望完全删除缓存并始终将数据存活,则只需将缓存管理器实现换成总是返回重新获取数据的缓存管理器实现。应用程序的其余部分完全没有意识到实现。

+0

好的,这看起来非常好。谢谢你的答案。我会尽快尝试。 – Clox

+0

对不起,在这里新手问题,但我似乎无法弄清楚如何使用从类文件中的AppState等。仍然是新的这个..我得到:“名称”AppState“不存在于当前的上下文中”。我想我必须使用using-keyword来导入它,但我无法弄清楚如何去做。 – Clox

+0

@Clox:取决于它存在的位置。请记住,这个类仍然与Web应用程序紧密耦合(凭借使用应用程序和会话),所以它应该在同一个项目中。我以前从未使用过'AppState',而且自从使用'Session'以来已经很长时间了。但正如我记得'Session'是'HttpContext'的一部分。所以,至少在很久以前,它会被System.Web.HttpContext.Current调用。会话“(http://msdn.microsoft.com/en-us/library/system.web.httpcontext.aspx)在基本页面类(或基本控制器类)上,”会话“刚刚映射到该属性。 – David

相关问题