我如何保持静态调用缓存在MVC

本文关键字:缓存 存在 MVC 调用 静态 何保持 | 更新日期: 2023-09-27 18:17:45

我设置了一个Configuration模型,该模型存储了一组(本质上)Key =>值对,这些值对可以由最终用户编辑。

为了使事情更容易,我设置了一个静态AppSettings类,以便在整个应用程序中更容易调用它们(配置值永远不会被最终用户创建或销毁,只会被修改)。

所以我们得到的是(注意-为了简洁起见,有些已经被删除了):

<<p> 初始化/strong>
var configurations = new List<Configuration>
{
    new Configuration{ Key="CurrentGameID", Value="1" },
    new Configuration{ Key="AllowedStudentSpaces", Value="2" },
    new Configuration{ Key="WelcomeMessage", Value="Howdy, users" },
};
configurations.ForEach(c => context.Configurations.Add(c));
context.SaveChanges();
辅助

public static class AppSettings
{
    private static MyContext db = new MyContext();
    public static int CurrentGameID
    {
        get
        {
            var configuration = db.Configurations.FirstOrDefault(c => c.ID == (int)ConfigIDs.CurrentGame);
            return Convert.ToInt32(configuration.Value);
        }
    }
    public static int AllowedStudentSpaces
    {
        get
        {
            var configuration = db.Configurations.FirstOrDefault(c => c.ID == (int)ConfigIDs.AllowedStudentSpaces);
            return Convert.ToInt32(configuration.Value);
        }
    }
    public static string WelcomeMessage
    {
        get
        {
            var configuration = db.Configurations.FirstOrDefault(c => c.ID == (int)ConfigIDs.WelcomeMessage);
            return configuration.Value;
        }
    }
}
enum ConfigIDs
{
    CurrentGame = 1,
    AllowedStudentSpaces = 2,
    WelcomeMessage = 3
};

这应该允许我调用任何我需要做的事情,如:

<h1>@AppSettings.WelcomeMessage</p>

if(numSpaces < AppSettings.AllowedStudentSpaces)
{
 // Do work
}

这工作得很好,但似乎我的应用程序喜欢缓存这些调用返回的值,当他们使用AppSettings类调用。更新的值不会出现,直到我已经清除了我的会话(通过使用不同的浏览器或其他东西)。是什么导致的呢?有办法绕过它吗?有没有比我现在做的更好的方法?

我如何保持静态调用缓存在MVC

使用System.Web.Mvc.OutputCacheAttribute,你可以创建一个自定义属性,像这样:

public class NoCacheAttribute : OutputCacheAttribute
{
    public NoCacheAttribute()
    {
        Location = OutputCacheLocation.None;
        NoStore = true;
        Duration = 0;
        VaryByParam = "None";
    }
}

并将其应用于不应该使用缓存的控制器

您应该设置一种方法,在每次页面加载时使用新的DbContext。现在,Configuration实体被附加到静态DbContext的本地,并且没有从数据库中重新加载。