我基本上创建了一个类,当用户登录到网站时,它会查询数据库并将一些设置存储在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));
}
}
}
由于
答案 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;
}