2012-05-03 13 views
2

コード内でConfigurationPropertyAttributeという名前を3回繰り返すと、本当に気になります。
プロパティのスペルミスやコピー/貼り付けを忘れて、名前のインスタンスを1つ更新するのは忘れがちです。ConfigurationPropertyAttributeを使用してプロパティ名を3回繰り返さないようにしてください

定数の宣言は、これらの問題の1つのみを解決します。より良い方法がありますか?

私は反射を試みましたが、属性を列挙するのははるかに面倒で醜いようでした。

[ConfigurationProperty("port", DefaultValue = (int)0, IsRequired = false)] 
[IntegerValidator(MinValue = 0, MaxValue = 8080, ExcludeRange = false)] 
public int Port 
{ 
    get 
    { 
     return (int)this["port"]; 
    } 
    set 
    { 
     this["port"] = value; 
    } 
} 

DRYは単なる原則であり、しばしば実世界では原則が実用的でなければならないことを知っています。しかし誰かがよりクリーンな方法を持っていると確信していますか?

答えて

3

必要に応じて、構成要素に非宣言的なアプローチを使用できます。例は、インターネット上で - 特にUnraveling the Mysteries of .NET 2.0 Configurationで見つけることができ、例では両方の方法を同時に示しています。

class MyConfigurationElement : ConfigurationElement 
{ 
    private static ConfigurationPropertyCollection _properties = new ConfigurationPropertyCollection(); 
    private static ConfigurationProperty _portProperty = new COnfigurationProperty("port", .....); // Will leave as example for you to add validator etc. 

    static MyConfigurationElement() 
    { 
     _properties.Add(_portProperty); 
    } 

    protected override ConfigurationPropertyCollection Properties 
    { 
     get { return _properties; } 
    } 

    public int Port 
    { 
     get 
     { 
      return (int)this[_portProperty]; 
     } 
     set 
     { 
      this[_portProperty] = value; 
     } 
    }  
} 
+0

+1:私はそれをやっているその方法を常に無視しています;-)これはまた、(実行時の)より速く、宣言的な方法(これがWCF/System.ServiceModel設定それは_extensive_です - 申し訳ありませんが、私がそれを読んだ場所を覚えていない)。おそらく、それは実際にコードにget/set-propertyを提供するだけで、コレクションにConfigurationPropertyを実際に追加/削除する「忘れる」問題があります。まあ、どちらのアプローチでも、最終的には自分がやっていることを知り、適切な「職人技」を採用しなければならないと思います。 –

2

定数を使用すると3つの問題がすべて解決されないのはなぜですか?

例:

class MyConfigurationElement : ConfigurationElement 
{ 

    // Use public, private or internal, as you see fit. 
    private const string PortName = "port"; 

    // Add something like this, if you also want to access the string value 
    // and don't want to recompile dependend assemblies when changing the 
    // string 'port' to something else. 
    // public static readonly PortNameProperty = PortName; 

    [ConfigurationProperty(PortName, DefaultValue = (int)0, IsRequired = false)] 
    [IntegerValidator(MinValue = 0, MaxValue = 8080, ExcludeRange = false)] 
    public int Port 
    { 
     get 
     { 
      return (int)this[PortName]; 
     } 
     set 
     { 
      this[PortName] = value; 
     } 
    }  
} 

側注:あなたもConfiguration Section Designerを使用して検討するかもしれない場合。率直に言えば、私は数年前にそれをテストして以来それを使用していませんでしたが、DRYについてのあなたの懸念も解決するかもしれません。

+1

私はコピー/ペースト/編集エラーの感覚だと思います。 PortプロパティをコピーしてFooプロパティを作成します。属性宣言をPortNameからFooNameに変更しますが、get/set参照を変更することは忘れてしまい、うまくコンパイルできません。すべての問題を解決するソリューションは、3回繰り返されるのではなく、1回だけ名前を指定することを可能にします。しかし、定数を使うことは、繰り返し魔法の文字列よりもまだ改善されています。 – hatchet

+1

@hatchetが合意した。しかし、私はここで複雑なことをすべきではないと思う。そのような問題を簡単に気にかけてテストします。とにかくXSDファイルの問題が残っていますが、これはとにかく(app.configファイルを編集するときに適切なインテリセンスサポートのために)作成する必要があります。そこに(属性)名が再びあります。単一のソースからのコード/ XSDの生成が短くても、ここで役立つものはありません。 –

関連する問題