C# 在以下场景中,在MVC应用程序中使用静态字段是否存在任何风险?

C# 在以下场景中,在MVC应用程序中使用静态字段是否存在任何风险?,c#,asp.net-mvc,asp.net-mvc-4,static,C#,Asp.net Mvc,Asp.net Mvc 4,Static,我有一个检测脏话的验证注释。我的脏话在数据库中,但我想把它们保存在内存中,以避免不必要的查询。我正在考虑向validation annotation类添加一个静态的脏话列表(作为普通的旧字符串),并在应用程序运行期间第一次使用验证时根据数据库中的内容填充它。使用此类解决方案是否存在任何风险 另外,我真的不在乎是否有人在应用程序运行期间向数据库添加更多的单词。有一个不完整的列表“直到下一次重新启动”就足够了(无论如何,应用程序每天都会重新启动)。如果您将它放在HttpContext.Current

我有一个检测脏话的验证注释。我的脏话在数据库中,但我想把它们保存在内存中,以避免不必要的查询。我正在考虑向validation annotation类添加一个静态的脏话列表(作为普通的旧字符串),并在应用程序运行期间第一次使用验证时根据数据库中的内容填充它。使用此类解决方案是否存在任何风险


另外,我真的不在乎是否有人在应用程序运行期间向数据库添加更多的单词。有一个不完整的列表“直到下一次重新启动”就足够了(无论如何,应用程序每天都会重新启动)。

如果您将它放在
HttpContext.Current.Cache
中并有一些过期期限,那就更好了。然后,该数据在缓存中过期时将被删除,然后您可以重新加载实际的最新数据。在这种情况下,数据的真实性将比静态列表更好

您可以编写这样的代码:

public static List<string> SwearWords
{
    get
    {
        List<string> items = HttpContext.Current.Cache["SwearWords"] as List<string>()
        if (items == null)
        {
            items = LoadThemFromDB();
            HttpContext.Current.Cache.Insert("SwearWords", 
                items, 
                null, 
                DateTime.Now.AddMinutes(10),
                Cache.NoSlidingExpiration);
        }
        return items;
    }
}

此代码名为双重检查锁定-

,只要您的咒骂词列表是线程安全的,就可以阅读

考虑使用
List
,因为可以同时从多个线程中读取,只要不写入任何内容

发件人:

只要不修改集合,
列表
可以同时支持多个读卡器


如果在应用程序池重新启动/回收之前您真的不关心数据是否过时,那么您的方法应该可以正常工作。+1用于详细解释。您可能希望向示例中添加一些线程同步,以避免多次从DB加载数据。
private static readonly object _swearWordsLockObj = new object();

public static List<string> SwearWords
{
    get
    {
        List<string> items = HttpContext.Current.Cache["SwearWords"] as List<string>()
        if (items == null)
        {
            lock(_swearWordsLockObj)
            {
                items = HttpContext.Current.Cache["SwearWords"] as List<string>()
                if (items == null)
                {
                    items = LoadThemFromDB();
                    HttpContext.Current.Cache.Insert("SwearWords", 
                        items, 
                        null, 
                        DateTime.Now.AddMinutes(10),
                        Cache.NoSlidingExpiration);
                }
            }
        }
        return items;
    }
}