我可以在执行结束时使静态变量生命周期结束吗?
Can I make static variable lifetime end at end of execution?
我正在尝试在用户第一次访问我的网站时动态创建一个菜单,如下面的代码所示。问题是我的静态全局变量的生命周期比执行时间长,所以如果用户对他们可以访问哪些菜单项的权限发生更改并且执行结束然后再次开始,旧菜单可能仍存储在 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);
}
}
}
如果您的菜单结构基于可能会更改的数据库相关值 suddenly/quickly,那么最好的选择可能是重建菜单每次往返,但这在可扩展性和性能方面存在缺陷。专注于生成一次菜单,将其保存到会话或视图状态中,并且仅在对站点进行新访问(新会话)时重建它的设计可能是更好的探索策略。
静态变量将在用户之间共享,因此这不是缓存每个用户值的菜单的合适位置。
您可以使用 Session
将数据存储在上下文中,该上下文将在该用户会话中的所有请求之间共享。
如果你想存储超出用户当前会话范围的数据(因为你只是缓存一个菜单,我不希望你需要会话以外的任何东西)你可以支持你的会话使用数据库,而不是使用内存中的会话实现,或者将数据显式存储在数据库中(不使用 Session
)。当然,由于这里的想法是您尝试缓存值,因此在这种情况下这似乎没有帮助。
我正在尝试在用户第一次访问我的网站时动态创建一个菜单,如下面的代码所示。问题是我的静态全局变量的生命周期比执行时间长,所以如果用户对他们可以访问哪些菜单项的权限发生更改并且执行结束然后再次开始,旧菜单可能仍存储在 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);
}
}
}
如果您的菜单结构基于可能会更改的数据库相关值 suddenly/quickly,那么最好的选择可能是重建菜单每次往返,但这在可扩展性和性能方面存在缺陷。专注于生成一次菜单,将其保存到会话或视图状态中,并且仅在对站点进行新访问(新会话)时重建它的设计可能是更好的探索策略。
静态变量将在用户之间共享,因此这不是缓存每个用户值的菜单的合适位置。
您可以使用 Session
将数据存储在上下文中,该上下文将在该用户会话中的所有请求之间共享。
如果你想存储超出用户当前会话范围的数据(因为你只是缓存一个菜单,我不希望你需要会话以外的任何东西)你可以支持你的会话使用数据库,而不是使用内存中的会话实现,或者将数据显式存储在数据库中(不使用 Session
)。当然,由于这里的想法是您尝试缓存值,因此在这种情况下这似乎没有帮助。