1

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

这样做的原因是因为我希望始终能够访问这些设置而无需再次访问数据库。

我将它们放在一个类中,并通过 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

4 回答 4

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
于 2013-11-04T11:11:21.557 回答
0

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

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

于 2013-11-04T11:25:14.350 回答
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;
    }
于 2013-11-04T11:29:14.973 回答
0

对于较少的用户,您可以按照 Bob 的建议使用 SessionState,但是对于更多的用户,您可能需要每次移动到状态服务器或从数据库加载它。

于 2013-11-04T11:15:33.063 回答