0

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

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

这些变量经常被访问并且定义起来有点繁重,所以我认为这样的事情是有意义的,而不是每次需要时都从头开始创建数据。即使不需要优化,它对我来说仍然有意义,因为它还通过在需要数据的一堆地方没有相同的代码来增加可读性和绝对可维护性。

同样,我通过在用户登录时将数据放入 Session 来针对每个用户执行类似的操作,例如

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

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

4

1 回答 1

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

应用程序的其余部分不知道也不关心它是来自应用程序状态、会话状态、数据库、文件还是缓存数据的任何其他临时位置。这完全由缓存管理器对象处理。因此,如果您想更改某些值的位置,请在该位置更改它们。或者,如果出于测试目的,您想完全删除缓存并始终获取数据,您只需将缓存管理器实现换成始终返回重新获取的数据的实现。应用程序的其余部分完全不知道实现。

于 2013-04-17T14:27:07.263 回答