我应该使用property或Dictionary对象来兑现配置数据

时间:2016-07-12 11:11:37

标签: c#

我将我的应用程序Web.config Key-Value数据缓存到Singleton对象,我可以在类属性或字典对象中存储配置数据。考虑到性能和灵活性,我无法决定使用字典或类属性。

    添加/删除新密钥时,
  1. 字典提供的更改较少,因为我不需要对我的Singleton模型逻辑进行任何修改,而如果我使用属性,则需要管理添加/删除相应密钥。
  2. 使用字典时,我需要在字符串中指定容易出错并且难以管理的密钥名称。
  3. 基于以上两个原因,我目前使用字典存储缓存数据。请建议是否存在更好的解决方案这是我的示例代码。

    public class ConfigData
    {
        /// <summary>
        /// The configuration data
        /// </summary>
        public static readonly IDictionary<string, string> ConfigurationData = new Dictionary<string, string>();
    
        /// <summary>
        /// Initializes the <see cref="ConfigData" /> class.
        /// </summary>
        static ConfigData()
        {
            try
            {
                ConfigurationData = NVCExtender.ToDictionary(ConfigurationManager.GetSection("appSettings") as NameValueCollection);
            }
            catch (Exception ex)
            {
    
                throw;
            }
        }
    }
    

2 个答案:

答案 0 :(得分:2)

您可以创建一个包装ConfigurationManager.AppSettingsIDictionary<string, string>的类,并公开读取/更新基础对象的属性,如下所示:

对于ConfigurationManager.AppSettings,您可以执行以下操作:

public class ConfigManager
{
    public string IPAddress
    {
         get
         {
             if (ConfigurationManager.AppSettings.Keys.Any(k => k == "IPAddr"))
                 return ConfigurationManager.AppSettings.GetValues("IPAddr")[0];

             return null;
         }
         set
         {
             if (ConfigurationManager.AppSettings.Keys.Any(k => k == "IPAddr"))
                 ConfigurationManager.AppSettings.Remove("IPAddr");

             ConfigurationManager.AppSettings.Add("IPAddr", value);
         } 
    }

对于IDictionary<string, string>,您可以执行以下操作:

public class ConfigManager
{
    private readonly IDictionary<string, string> m_Dictionary;

    public ConfigManager(IDictionary<string, string> dictionary)
    {
        m_Dictionary = dictionary;
    }

    public string IPAddress
    {
         get
         {
             if (m_Dictionary.ContainsKey("IPAddr"))
                return m_Dictionary["IPAddr"];

             return null;
         }
         set
         {
             if (m_Dictionary.ContainsKey("IPAddr"))
                 m_Dictionary.Remove("IPAddr");

             m_Dictionary.Add("IPAddr", value);
         } 
    }

答案 1 :(得分:0)

ConfigurationManager.AppSettings已经是NameValueCollection,用您自己的Dictionary<string,string>替换它没什么价值。

将appSettings表示为静态或单例类的属性有许多好处:

  • 您可以在一个地方进行验证和空检查。
  • 您可以强行输入属性
  • 您可以在一个位置为缺少的appSettings提供默认值。
  • 访问设置时会获得智能感知。

所有的设计都是权衡,所以这些好处是否能够证明编写和维护静态/单例类的努力是一种判断。我经常在每个程序集中有一个内部静态类,它使用多个或两个appSettings,并为该程序集使用的每个appSetting设置一个强类型属性。

如果你这样做,那么值得采用命名约定,以便清楚哪些appSettings属于哪些程序集,例如&#34; MyAssembly1.MySetting&#34;,&#34; MyAssembly2.MyOtherSetting&#34;