2009-06-12 1 views
1

私は答えをここで検索しました。これが以前に尋ねられたのであれば、私は申し訳ありません。プロパティ名を複製せずにweb.configに厳密に型指定された呼び出しを行いますか?

要約:プロパティ名を複製せずにweb.configに強く型付けされた呼び出しを行うにはどうすればよいですか?


詳細:私のコードでは、私は、文字列の使用を最小限に抑えるようにしてください、と私は二回何かを定義し好きではありません。

これらの両方を補完することは、私がプロジェクト全体で参照する1つのクラスにAppSettingsの使用法(およびその文字列)を制限することです。 AppSettingsクラスには、パブリックプロパティを公開します。

12 public static string DateFormatString { 
    13  get { 
    14   return ConfigurationManager.AppSettings["DateFormatString"]; 
    15  } 
    16 } 

は、どのように私は、このクラスを維持し、プロパティ名の重複(行12 & 14)を防ぐことができますか?

また、他にどのようなソリューションをお勧めしますか?

答えて

0

私はおそらくオブジェクトにweb.configファイルをデシリアライズお勧めします。彼らはプロパティ(はるかに強く型付けされたものより取得することはできません!)

+0

これは私の強く入力する必要性にどのように適合しますか?どんなオブジェクトタイプに私は逆直列化するでしょうか? – lance

0

一つの解決策は、

public enum Settings 
{ 
    None, 
    DateFormatString, 
    DefeaultUserPrefix, 
    SomeOtherValue 
} 

ことが、その後のようなヘルパークラスを持つことができ、

であるかのようにあなたは、すべての設定エントリにアクセスすることができます
public static class ConfigurationHelper 
{ 
    public static Get<T>(Settings setting) 
    { 
     string output = ConfigurationManager.AppSettings[setting.ToString()]; 
     if(string.isNullOrEmpty(output)) 
       throw new ConfigurationErrorsException("Setting " + setting + " is not defined in Configuration file."); 
     return (T)output; //You can probably use Convert.* functions. 
    } 
} 

あなたの呼び出し元のコードは次のようになります、

上記のアプローチいくつかレベルの強い型指定を提供しますが、設定ファイルの設定名が列挙型の名前と一致することを確認する必要があります。

設定ファイルに基づいてクラスを自動生成することをお勧めします。あなたは強く型付けされたプロパティを望んでいた場合


することは、あなたは

public static string DateFormatString 
{ 
    get { return ConfigurationHelper.Get<string>(Settings.DateFormatString); } 
} 

また、私はコンストラクタで設定ファイルを読み込むに対して(時期尚早な最適化を?)アドバイスうを書くことができます。コンストラクタでconfigファイルを読むと、アプリケーションの実行中に設定ファイルを変更できないことを意味します。

0

私は直接私に属していないすべてのラッパーを作成します。これには、キャッシュ、セッション、設定、外部Webサービスなどが含まれます。これにより、そのウィジェットを使用することの汚い詳細をカプセル化できます。設定の場合、私は自分のapp.configまたはweb.configを格納しているさまざまなプロパティを公開する裸の構成クラスを持っています。これは次のようになります。

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Linq; 
using System.Text; 
using RanchBuddy.Core.Services.Impl; 
using StructureMap; 

namespace RanchBuddy.Core.Services.Impl 
{ 
    [Pluggable("Default")] 
    public class ConfigurationService : IConfigurationService 
    { 
     internal static int GetDefaultCacheDuration_Days() 
     { 
      return Convert.ToInt32(ConfigurationManager.AppSettings["DefaultCacheDuration_Days"]); 
     } 

     ... 

     internal static LoggingType GetLoggingType() 
     { 
      string loggingType = ConfigurationManager.AppSettings["LoggingType"].ToString(); 
      if(loggingType.ToLower() == "verbose") 
      { 
       return LoggingType.Verbose; 
      } 
      else if (loggingType.ToLower() == "error") 
      { 
       return LoggingType.Error; 
      } 
      return LoggingType.Error; 
     } 

     ... 

     public static string GetRoot() 
     { 
      string result = ""; 
      if(ConfigurationManager.AppSettings["Root"] != null) 
      { 
       result = ConfigurationManager.AppSettings["Root"].ToString(); 
      } 
      return result; 
     } 
    } 
} 

ここでは、設定ファイルから値を取得するだけではなく、簡単に値を取得できます。文字列を必要な型に変換できます。この文字列を使用して、返される列挙型の値を判断できます。しかし、重要な点は、設定に関して今まで必要とされていた変更をここで行うことができることです。コンフィグレーションストアのメカニズムを交換する場合に含めるには!

0

Configuration Section Designerを使用して独自のConfigurationSectionを構築し、この方法は、あなたは、すべてのAppSettingsを使用する必要はありません...しかし、あなたもweb.configファイルでインテリセンスを持っています設定の独自のコレクションを持っています。

1

例に重複はありません:1つのDateFormatStringはプロパティ名で、もう1つは文字列です。値のルックアップキーと同じようにプロパティに名前を付ける規則に従っているだけです。

改善が1つあります。プロパティーにアクセスするたびにAppSettingsから値を読み取るのではなく、静的なコンストラクターで設定ファイルを一度読み込み、値を保存する必要があります。

+0

一度/コンストラクタについての大きなポイント。 「重複なし」に関しては、web.config内のプロパティの名前を変更するときに、2つの場所でコードを編集する必要はありません。 – lance

+0

web.configの代わりにリソースファイルの設定を使用できます。プロジェクトのプロパティページの[設定]タブに設定を入力します。 –

関連する問題