2016-07-12 7 views
1

私のアプリケーションWeb.configキー値データをクラスプロパティまたはディクショナリオブジェクトに設定データを格納できるSingletonオブジェクトにキャッシュします。パフォーマンスと柔軟性を考慮すると、私は辞書やクラスのプロパティの使用を決めることができません。私はプロパティを使用する場合、私は、各キーの追加/削除を管理する必要があるのに対し、私のシングルトンモデルのロジックに変更を加える必要はありませんように、新しいキーが削除/追加されるたびに設定データをキャッシュするためにプロパティまたはディクショナリオブジェクトを使用する必要があります

  1. 辞書はあまり変化しています。
  2. 辞書を使用しているうちに、エラーが発生しやすく管理が困難な文字列にキー名を指定する必要があります。

上記の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; 
     } 
    } 
} 
+1

キャッシュしないとどうなりますか?私は 'ConfigurationManager'を通して' config'データに直接アクセスすることを意味します。これに何か問題はありますか? – Bharadwaj

+0

Web設定データをキャッシュする理由は、私たちが現金化すれば、Configuration XMLクラスを使用することによって、config XMLの読み取りに必要なキー値を追加する必要がないという神話でした。しかし、ConfigurationManagerクラスは、XMLのKey-Valueデータをキャッシュすることで、私が達成したいことを正確に実行します。 –

+0

これらのオプションがxmlファイルに含まれている理由があります。値を変更する場合は、新しい値のキャッシュを更新するタイミングを処理する必要があります。私が見ているようにキャッシュしない方が良いです。 – Bharadwaj

答えて

0

ConfigurationManager.AppSettingsは既にNameValueCollectionであり、これを自分自身のDictionary<string,string>に置き換える価値はほとんどありません。静的またはシングルトンクラスのプロパティとしてのappSettingsを表現

は多くの利点があります。

  • あなたは一つの場所に検証し、nullチェックを持つことができます。
  • プロパティを強く型付けすることができます
  • 欠落しているappSettingsのデフォルト値は、1か所で指定できます。
  • 設定にアクセスすると、インテリセンスが得られます。

これらの利点がスタティック/シングルトンクラスを作成し維持する努力を正当化するか否かにかかわらず、すべてのデザインはトレードオフです。私はしばしば、1つ以上のappSettingsを使用する各アセンブリに内部静的クラスを持ち、そのアセンブリで使用される各appSettingに強く型付けされたプロパティを持ちます。

これを行う場合は、命名規則を採用することで、どのappSettingsがどのアセンブリに属しているかがわかります(たとえば、 "MyAssembly1.MySetting"、 "MyAssembly2.MyOtherSetting")。

2

あなたはConfigurationManager.AppSettingsまたはIDictionary<string, string>をラップし、読んでプロパティを公開するクラスを作成することができます/次のように基礎となるオブジェクト更新:

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); 
     } 
    } 
ConfigurationManager.AppSettingsについては

を、次の操作を行うことができます

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

IDictionary<string, string>については、次の操作を行うことができます

関連する問題