簡體   English   中英

我應該使用屬性還是Dictionary對象來兌現配置數據

[英]Should i use property or Dictionary object for cashing config data

我將我的應用程序Web.config鍵值數據緩存到一個Singleton對象中,可以在其中將配置數據存儲在類屬性或字典對象中。 考慮到性能和靈活性,我無法在使用字典或類屬性之間做出選擇。

  1. 每當添加/刪除新的Key時,字典提供的更改較少,因為我不必對Singleton模型邏輯進行任何修改,而如果我使用屬性,則需要管理相應Key的添加/刪除。
  2. 在使用字典時,我需要在字符串中指定鍵名,這很容易出錯並且難以管理。

基於以上兩個原因,目前我正在使用字典來存儲緩存的數據。 請提出是否存在更好的解決方案,這是我的示例代碼。

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;
        }
    }
}

您可以創建一個包裝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);
         } 
    }

ConfigurationManager.AppSettings已經是一個NameValueCollection ,用您自己的Dictionary<string,string>替換它幾乎沒有什么價值。

將appSettings表示為靜態或單例類的屬性有很多好處:

  • 您可以在一處進行驗證和null檢查。
  • 您可以將屬性設為強類型
  • 您可以在一處為缺少的appSettings提供默認值。
  • 訪問設置時,您將獲得智能感知。

所有設計都需要權衡取舍,因此這些好處是否足以證明編寫和維護static / singleton類的努力是正確的判斷。 我通常在每個Assembly中都有一個內部靜態類,該類使用一個或兩個以上的appSettings,以及該Assembly使用的每個appSetting的強類型屬性。

如果這樣做,則值得采用命名約定,以便清楚地知道哪個appSettings屬於哪個程序集,例如“ MyAssembly1.MySetting”,“ MyAssembly2.MyOtherSetting”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM