在我的Web应用程序中,我在Application_Start
期间从外部配置文件中读取了一些设置,然后通过应用程序的许多方法访问它们:
namespace Common
{
public static class CommonConfigSettings
{
public static string DataSource { get; set; }
public static string DatabaseName { get; set; }
public static string DatabaseUserName { get; set; }
public static string DatabasePassword { get; set; }
}
}
在Application_Start
期间,这些文件从XML文件读入静态变量:
DataSource = els.FirstOrDefault(item => item.Attribute("key").Value == "DataSource").Attribute("value").Value;
DatabaseName = els.FirstOrDefault(item => item.Attribute("key").Value == "DatabaseName").Attribute("value").Value;
DatabaseUserName = els.FirstOrDefault(item => item.Attribute("key").Value == "DatabaseUserName").Attribute("value").Value;
DatabasePassword = els.FirstOrDefault(item => item.Attribute("key").Value == "DatabasePassword").Attribute("value").Value;
在应用程序中,它们按如下方式使用:
myConn.ConnectionString = string.Format("Persist Security Info=False; User ID={0}; Password={1}; Initial Catalog={2}; Data Source={3}; Connection Timeout=60",
CommonConfigSettings.DatabaseUserName,
CommonConfigSettings.DatabasePassword,
CommonConfigSettings.DatabaseName,
CommonConfigSettings.DataSource);
在任何时间点,静态值都写入以下Application_Start
- 它们只会被读回(尽管可能同时由2个以上的人)。也没有静态方法,只有属性。我读到了锁定和线程安全性here和here,但我只是弄糊涂了。我应该对这些值实施锁定,如果是,请在什么时候点?
答案 0 :(得分:2)
如果您完全确定这些属性只写入一次(并且在所有读取操作之前),则无需锁定。
编辑:问题是:它会一直如此吗?如果您需要在运行时替换此数据库访问信息,则会遇到非原子操作的问题(例如,如果写入线程在右侧中断,则读取新数据库用户名和旧密码#34;错误"时间)。可能最好提供一种方法来返回单个结构中所有需要的数据。如果需要,将来可以为此方法提供线程锁定机制......
public struct DatabaseAccessData
{
public string DataSource { get; set; }
public string DatabaseName { get; set; }
public string DatabaseUserName { get; set; }
public string DatabasePassword { get; set; }
}
public static class CommonConfigSettings
{
private static string DataSource { get; set; }
private static string DatabaseName { get; set; }
private static string DatabaseUserName { get; set; }
private static string DatabasePassword { get; set; }
public static void SetDatabaseAccessData(DatabaseAccessData data)
{
DataSource = data.DataSource;
DatabaseName = data.DatabaseName;
DatabaseUserName = data.DatabaseUserName;
DatabasePassword = data.DatabasePassword;
}
public static DatabaseAccessData GetDatabaseAccessData()
{
return new DatabaseAccessData
{
DataSource = DataSource,
DatabaseName = DatabaseName,
DatabaseUserName = DatabaseUserName,
DatabasePassword = DatabasePassword
};
}
让我说我不是"静电"在这种情况下。如果某些类依赖于具有公共配置设置,则应通过构造函数参数或属性将CommonConfigSettings实例传递给它们(请参阅"依赖注入")。我更喜欢第一个,因为它更严格/严格;你不能忘记传递一个重要的依赖。