Warum validieren ConfigurationValidator den Standardwert eines Configuration auch wenn IsRequired wahr ist?

StackOverflow https://stackoverflow.com/questions/3744953

  •  04-10-2019
  •  | 
  •  

Frage

Lassen Sie uns sagen, dass ich eine Konfiguration Eigenschaft haben, dass wie folgt aussieht. Beachten Sie, dass es keinen Standardwert.

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

Nun füge ich meinen Abschnitt wie folgt aus:

<mySection x="123" />

Ich werde diesen Fehler:

Der Wert für die Eigenschaft ‚x‘ ist nicht gültig. Der Fehler ist: Der String muss sein mindestens 1 Zeichen lang sein.

Es funktioniert, wenn ich die Konfigurationseigenschaften ändern, um eine Standard wie folgt enthalten:

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

Dies bedeutet, dass Validator den Standardwert überprüft, auch wenn IsRequired wahr ist. Es bedeutet auch, dass ich ein Dummy-Standardwerte auf alle meine Eigenschaften enthalten müssen Validierung passieren, auch wenn sie nicht tatsächlich verwendet wird.

Ist das nur schlechte Design oder gibt es einen triftigen Grund für dieses Verhalten?

War es hilfreich?

Lösung

Ich habe dieses Problem vorher hatte. Es gab einen triftigen Grund dafür, aber ich kann die Details nicht erinnern.

Ich kann nicht, wenn diese Werke erinnern, aber Sie können versuchen, die Eigenschaft im Konstruktor deklarieren, wo null ist der Standardwert.

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

Dies im Zusammenhang mit mit Standardwerten und Validatoren aber ist ein Standardwert gesucht. http://msdn.microsoft .com / de-de / library / system.configuration.configurationproperty (VS.85) aspx # 1

EDIT

Ich habe aus dem vorherigen Code gerade versucht, und es funktioniert wie ich erwartet hatte. Mein bisheriger Code nicht kompilieren, wie ich eine Konstruktor Eigenschaft verpasste so ich, dass behoben habe.

Andere Tipps

Der Grund dafür ist, dass die Konfigurationsabschnitt Klassen in Code newed werden können, ohne dass es eine Konfigurationsdatei zu sein. Sie können einen Standard-Konstruktor verwenden und keine Werte für die Eigenschaft angeben. In diesem Fall, auch wenn Sie IsRequired=true angegeben haben, gibt es keine geworfene Ausnahme. Mit anderen Worten gilt IsRequired nur, wenn die Eigenschaft von XML wird deserialisiert wird.

Allerdings DefaultValue hat gilt in diesem Fall, wie es funktioniert, wenn die Eigenschaft von XML wird deserialisiert (wie jedes ConfigurationValidatorAttribute).

Dies ist sinnvoll, wenn Sie Konfigurationsabschnitte in Unit-Tests verwenden. Es ist wirklich schön zu A) einen deklarativen Standardwert, wenn Sie den Abschnitt und B Konstruktion) haben den Standardwert überprüft.

Wie pro meinem Verständnis ist dieses Verhalten sehr erforderlich.

Da die Konfiguration eines der Kernbereich jeder Anwendung ist, und nehmen wir an, hat keinen Wert für eine Anwendung kritische Eigenschaft zur Verfügung gestellt worden ist, dann kann die gesamte Anwendung zu einem gewissen unerwünschten Verhalten führen (könnte ein Absturz sein, unbestimmte Ressourcennutzung usw. ). Ich denke, dass der Grund dafür ist, die meisten der .Net eingebauten Konfigurationseigenschaften wie Session-Timeout usw. auf einen Standardwert gesetzt wurden, und sie werden auch Benutzer angewendet werden, hat Wert nicht angegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top