在c#中存储全局变量?

时间:2013-11-04 10:57:47

标签: c# asp.net caching static-members

我基本上创建了一个类,当用户登录到网站时,它会查询数据库并将一些设置存储在List中(所以我有键/对值)。

之所以这样,是因为我希望无需再次访问数据库即可访问这些设置。

我将它们放在一个类中,并通过SQL查询遍历字段并将它们添加到列表中。

如何从应用程序的其他部分访问这些变量?或者有更好的方法吗?我说服务器端而不是客户端。

这是我目前所拥有的一个例子:

public static void createSystemMetaData()
{
    string constring = ConfigurationManager.ConnectionStrings["Test"].ConnectionString;
    SqlConnection sql = new SqlConnection(constring);
    sql.Open();

    SqlCommand systemMetaData = new SqlCommand("SELECT * FROM SD_TABLES", sql);
    //Set Modules
    using (SqlDataReader systemMetaDataReader = systemMetaData.ExecuteReader())
    {
        while (systemMetaDataReader.Read())
        {
            var name = systemMetaDataReader.GetOrdinal("Sequence").ToString();
            var value = systemMetaDataReader.GetOrdinal("Property").ToString();
            var Modules = new List<KeyValuePair<string, string>>();
            Modules.Add(new KeyValuePair<string, string>(name, value));
        }
    }
}

由于

4 个答案:

答案 0 :(得分:2)

假设您在IIS下使用ASP.NET,类的任何静态属性都将在应用程序池的生命周期内保留。

所以一个非常简单的类看起来像:

public static class MyConfigClass
{
    public static Lazy<Something> MyConfig = new Lazy<Something>(() => GetSomethings());

    public static Something GetSomethings()
    {
        // this will only be called once in your web application
    }
}

然后您可以通过简单地调用

来消费它
MyConfigClass.MyConfig.Value

答案 1 :(得分:0)

对于较少的用户,您可以像Bob建议的那样使用SessionState,但是对于更多用户,您可能需要每次都移动到状态服务器或从Data Base加载它。

答案 2 :(得分:0)

正如其他人所指出的那样,将这些值保存在全局记忆中的风险是值可能会发生变化。此外,全局变量是一个糟糕的设计决策,因为您最终可能会在应用程序的各个部分读取和写入这些值,这会使调试问题变得更加困难。

一种常用的解决方案是将数据库访问包装在facade类中。如果您希望避免为每个请求命中数据库,则此类可以缓存值。此外,由于更改也通过外观进行路由,因此它会知道数据何时发生更改并在发生此情况时清空其缓存(强制重新读取数据库)。作为额外的奖励,可以模拟外观以便在不触及数据库的情况下测试代码(数据库访问非常难以进行单元测试)。

答案 3 :(得分:0)

从使用普遍值的事物来看,无论用户如何,SqlCacheDependency在这里都很有用:

确保在web.config中为名称Test

设置数据库依赖项
public static class CacheData {

  public static List<KeyValuePair<string,string>> GetData() {
    var cache = System.Web.HttpContext.Current.Cache;
    SqlCacheDependency SqlDep = null; 
    var modules = Cache["Modules"] as List<KeyValuePair<string,string>>;
    if (modules == null) { 

        // Because of possible exceptions thrown when this 
        // code runs, use Try...Catch...Finally syntax. 
        try { 
            // Instantiate SqlDep using the SqlCacheDependency constructor. 
            SqlDep = new SqlCacheDependency("Test", "SD_TABLES"); 
        } 

        // Handle the DatabaseNotEnabledForNotificationException with 
        // a call to the SqlCacheDependencyAdmin.EnableNotifications method. 
        catch (DatabaseNotEnabledForNotificationException exDBDis) { 
                SqlCacheDependencyAdmin.EnableNotifications("Test"); 
        } 

        // Handle the TableNotEnabledForNotificationException with 
        // a call to the SqlCacheDependencyAdmin.EnableTableForNotifications method. 
        catch (TableNotEnabledForNotificationException exTabDis) { 
                SqlCacheDependencyAdmin.EnableTableForNotifications("Test", "SD_TABLES"); 

       } 
       finally { 
            // Assign a value to modules here before calling the next line
            Cache.Insert("Modules", modules, SqlDep); 
        } 
      }
      return modules;
    }