gpt4 book ai didi

c# - 这些静态应用程序属性是否需要锁定?

转载 作者:行者123 更新时间:2023-11-30 23:19:37 25 4
gpt4 key购买 nike

在我的 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 个人以上读出)。也没有静态方法,只有属性。我阅读了有关锁定和线程安全的信息 herehere ,但只是让自己感到困惑。我应该对这些值实现锁定吗?如果是,请在什么时候实现?

最佳答案

如果您绝对确定这些属性只写入一次(并且在所有读取操作之前),则不需要锁定。

编辑:问题是:它会一直如此吗?如果您需要在运行时替换此数据库访问信息,您将遇到非原子操作的问题(例如,如果写入线程在右侧被中断,则读取新的数据库用户名和旧密码/”不合时机)。提供一种在单个结构中返回所有需要的数据的方法可能会很好。如果以后有需要,可以为该方法提供线程锁定机制……

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 的实例传递给它们(请参阅“依赖注入(inject)”)。我更喜欢第一个,因为它更严格/严格;你不能忘记传递一个重要的依赖关系。

关于c# - 这些静态应用程序属性是否需要锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40173331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com