Perché ConfigurationValidator convalidare il valore predefinito di un ConfigurationProperty anche se IsRequired è vero?

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

  •  04-10-2019
  •  | 
  •  

Domanda

dire Let ho una proprietà di configurazione che assomiglia a questo. Si noti che non v'è alcun valore predefinito.

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

Ora aggiungo la mia sezione in questo modo:

<mySection x="123" />

I otterrà questo errore:

  

Il valore per la proprietà 'x' non è   valido. L'errore è: Il mosto stringa   essere di almeno 1 caratteri.

Funziona se cambio la proprietà di configurazione per includere un default in questo modo:

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

Questo implica che validatore convalida il valore di default anche se IsRequired è vero. E significa anche che devo includere un valore fittizio di default su tutti i miei oggetti da superare la convalida anche se non sarà effettivamente utilizzato.

E 'solo una cattiva progettazione o c'è una ragione valida per questo comportamento?

È stato utile?

Soluzione

Ho avuto questo problema prima. C'era una ragione valida per questo, ma non riesco a ricordare i dettagli.

non ricordo se questo funziona, ma si può provare che dichiara la proprietà nel costruttore in cui nulla è il valore di default.

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

Questo è legato al utilizzando i valori predefiniti e validatori ma è dove un valore predefinito è voluto. http://msdn.microsoft .com / it-it / library / system.configuration.configurationproperty (VS.85) aspx # 1

Modifica

Ho appena provato il codice precedente e lo fa come mi aspettavo. Il mio codice precedente non compilare come ho perso una proprietà constructor così ho fissato questo.

Altri suggerimenti

Il motivo è che le classi della sezione di configurazione possono essere newed in codice senza che vi sia un file di configurazione. È possibile utilizzare un costruttore di default e non specificare alcun valore per la proprietà. In questo caso, anche se è stato specificato IsRequired=true non v'è alcuna eccezione generata. In altre parole, IsRequired si applica solo se la proprietà viene deserializzato da XML.

Tuttavia, DefaultValue non si applicano in questo caso, come avviene quando la proprietà viene deserializzato da XML (come fa qualsiasi ConfigurationValidatorAttribute).

Questo ha un senso se si sta utilizzando sezioni di configurazione di test di unità. E 'davvero bello A) hanno un valore di default dichiarativa quando si costruisce la sezione A e B) hanno il valore predefinito convalidato.

Come per la mia comprensione, questo comportamento è altamente richiesto.

Dato che la configurazione è quella della zona centrale di qualsiasi applicazione, e supponiamo, nessun valore è stato fornito per una proprietà fondamentale applicazione, quindi l'intera applicazione può portare a un comportamento indesiderato (potrebbe essere un incidente, l'utilizzo delle risorse a tempo indeterminato, ecc ). Penso che sia la ragione, la maggior parte delle proprietà di configurazione integrato .Net come Session timeout ecc sono stati fissati ad un valore di default e saranno applicate anche utente non ha specificato il valore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top