我可以在执行结束时使静态变量生命周期结束吗?

时间:2015-06-17 17:03:28

标签: c# asp.net static-variables

我正在尝试在用户第一次访问我的网站时动态创建菜单,如下面的代码所示。问题是我的静态全局变量生命周期比执行时间长,因此如果用户对可以访问哪些菜单项的权限更改并执行结束然后再次启动旧菜单仍可能存储在MainMenu和MenuGenerated = 1中,那么他们将看到旧菜单,因为新菜单将不会生成。

我可以使用不同类型的变量来解决这个问题,还是有不同的方法可以解决这个问题?

public static class Globals
{
    public static List<MenuItem> MainMenu = new List<MenuItem>();
    public static Int32 MenuGenerated = 0;
}

public partial class SiteMaster : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List<MenuItem> MainMenu = Globals.MainMenu;
        if (Globals.MenuGenerated == 0)
        {
             //set MenuGenerated=1
             //Generate menu items based on permissions stored in SQL tables
             //store in global MainMenu
        }
        foreach (MenuItem i in MainMenu)
        {
            NavigationMenu.Items.Add(i);
        }
    }
 }

2 个答案:

答案 0 :(得分:1)

静态变量将在用户之间共享,因此不适合缓存每个用户值的菜单。

您可以使用Session将数据存储在将在其会话中的该用户的所有请求之间共享的上下文中。

如果您想将数据存储在用户当前会话的范围之外(因为您只是缓存菜单,我不希望您需要除会话之外的任何其他内容)您可以使用数据库备份会话,而不是使用内存中会话实现,或者将数据显式存储在数据库中(不使用Session)。当然,既然这里的想法是你试图缓存价值,那么在这种情况下这似乎没有用。

答案 1 :(得分:0)

如果你有一个基于数据库相关值的菜单结构,可能会突然/快速地改变那个,那么最好的选择可能是在每次往返时重建菜单,但是具有可伸缩性和性能的缺点。一种设计,专注于生成菜单一次,将其持久保存到会话或视图状态,并且只在重新访问网站(新会话)时重建它,可能是更好的第一个探索策略。