13

このような構成プロパティがあるとしましょう。デフォルト値がないことに注意してください。

[ConfigurationProperty("x", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
    get { return (string)this["x"]; }
    set { this["x"] = value; }
}

次に、次のようにセクションを追加します。

<mySection x="123" />

このエラーが発生します:

プロパティ'x'の値が無効です。エラーは次のとおりです。文字列は少なくとも1文字の長さである必要があります。

次のようなデフォルトを含めるように構成プロパティを変更すると機能します。

[ConfigurationProperty("x", DefaultValue="abc", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
    get { return (string)this["x"]; }
    set { this["x"] = value; }
}

これは、IsRequiredがtrueの場合でも、バリデーターがデフォルト値を検証することを意味します。また、実際には使用されない場合でも、検証に合格するには、すべてのプロパティにダミーのデフォルト値を含める必要があることも意味します。

これは単に悪い設計ですか、それともこの動作の正当な理由がありますか?

4

4 に答える 4

7

私は以前にこの問題を抱えていました。これには正当な理由がありましたが、詳細を思い出せません。

これが機能するかどうかは思い出せませんが、null がデフォルト値であるコンストラクターでプロパティを宣言してみてください。

public class CustomConfigurationSection : ConfigurationSection
{
    public CustomConfigurationSection()
    {
        Properties.Add(new ConfigurationProperty(
            "x",
            typeof(string),
            null,
            null,
            new StringValidator(1),
            ConfigurationPropertyOptions.IsRequired));
    }


    public string X
    {
        get { return (string)this["x"]; }
        set { this["x"] = value; }
    }
}

これは、デフォルト値とバリデータの使用に関連していますが、デフォルト値が必要な場合です。 http://msdn.microsoft.com/en-us/library/system.configuration.configurationproperty(VS.85).aspx#1

編集

以前のコードを試してみたところ、期待どおりに動作します。以前のコードは、コンストラクターのプロパティを見逃していたためコンパイルできなかったので、修正しました。

于 2010-09-19T08:48:46.747 に答える
3

その理由は、構成ファイルがなくてもコードで構成セクション クラスを新しくすることができるからです。プロパティの値を指定せずに、既定のコンストラクターを使用できます。この場合、指定IsRequired=trueしても例外はスローされません。つまり、IsRequiredプロパティが XML から逆シリアル化されている場合にのみ適用されます。

ただし、プロパティが XML から逆シリアル化されている場合と同様に、この場合DefaultValue ConfigurationValidatorAttribute適用されます ( any の場合と同様)。

これは、単体テストで構成セクションを使用している場合に意味があります。A) セクションを構築するときに宣言的なデフォルト値を持ち、B) デフォルト値を検証することは本当に素晴らしいことです。

于 2012-02-05T14:06:48.080 に答える
0

私の理解によると、この動作は非常に必要です。

構成はアプリケーションのコア領域の 1 つであり、アプリケーションの重要なプロパティに値が指定されていないと仮定すると、アプリケーション全体が望ましくない動作 (クラッシュ、無期限のリソース使用など) につながる可能性があります。それが理由だと思います。セッションタイムアウトなどの.Net組み込み構成プロパティのほとんどはデフォルト値に設定されており、ユーザーが値を指定しなくても適用されます。

于 2010-09-19T12:00:02.093 に答える