Ciao Marco.
Una domanda veloce: ma sei sicuro che abbia senso esporre le proprietà di configurazione anche in scrittura (set)?

Questo codice (basato sul tuo esempio):

CustomSection.DeclarativeModel configD = (CustomSection.DeclarativeModel)ConfigurationManager.GetSection("Modelli.Di.Sviluppo/DeclarativeCustomSection");

configD.Name = "Pippo";


non genera un'eccezione?

O sbaglio io qualcosa?

Matteo Casati
GURU4.net
ciao Matteo, scusa ho fatto caso solo adesso al tuo commento, spesso non mi arrivano le notifiche, credo che il mio antivirus si prenda troppe libertà.

l'accessore (ma si chiama così  ?) set va esposto in quando viene usato dal Runtime.

che eccezione ricevi?

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
che sciocco.... ho riletto il messaggio

per cambiare le impostazioni il Web.config va aperto il lettura:


Configuration config = WebConfigurationManager.OpenWebConfiguration("/GiadaWeb");
                    settings = (GiadaConfigSection)config.GetSection("giadaSetting");
                    settings.MaintenaceAreaProviderName = "pippo";


ciao marco

p.s. GiadaConfigSection è una sezione di configurazione "identica" a quello dello script
Modificato da nostromo il 22 marzo 2006 17.16 -

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
nostromo ha scritto:
ciao Matteo, scusa ho fatto caso solo adesso al tuo commento, spesso non mi arrivano le notifiche, credo che il mio antivirus si prenda troppe libertà.


Nessun problema, ci mancherebbe.
Solo che, conoscendo la tua velocità di risposta, mi stavo preoccupando

l'accessore (ma si chiama così  ?) set va esposto in quando viene usato dal Runtime.
che eccezione ricevi?


Ho ricreato un esempio tramite copia/incolla dal tuo script nel Web.config e per le 2 classi DeclarativeModel e ProgrammaticModel; in una pagina aspx ho poi aggiunto un button con l'evento onlick seguente:

protected void Button1_Click(object sender, EventArgs e)
{
 CustomSection.DeclarativeModel configD = (CustomSection.DeclarativeModel)ConfigurationManager.GetSection("Modelli.Di.Sviluppo/DeclarativeCustomSection");
 configD.Name = "NEW VALUE";
}


Mandando in esecuzione e cliccando sul bottone:

Exception Details: System.Configuration.ConfigurationErrorsException: The configuration is read only.
set
{
 this["name"] = value;
}
}


Il dubbio mi era venuto perché creando le mie classi di configurazione custom (inconsciamente) non avevo mai implementato gli accessor (lo lascio in inglese che suona meglio  ) di "set"...

Sempre a proposito del mio modo di implementare le classi che derivano da ConfigurationSection, vorrei un tuo (vostro!) punto di vista.
Posto di seguito un semplice esempio:

using System;
using System.Configuration;

public class MyConfiguration : ConfigurationSection
{
    private static MyConfiguration _instance = null;

    private MyConfiguration() { }   // no istanza diretta

    public static MyConfiguration GetInstance()
    {
        if (_instance == null)
            _instance = ConfigurationManager.GetSection("myConfiguration") as MyConfiguration;
        return _instance;
    }

    [ConfigurationProperty("fileName", DefaultValue = "sample.txt", IsRequired = true)]
    [StringValidator(InvalidCharacters = " ~!@#$%^&*()[]{}/;'\"|\\", MinLength = 1, MaxLength = 20)]
    public string FileName
    {
        get { return (string)this["fileName"]; }
    }
}


Che poi uso così:

string file = MyConfiguration.GetInstance().FileName;


Che ne dici/dite?

Matteo Casati
GURU4.net
direi ottimo e pulito

anzi è un ottima idee che utilizzerò  .

in genere uso questa tecnica per alcuni "special case" tipo oggetti vuoti, tanti per risparmiare qualche istanza.

p.s. ho aggiunto il metodo WebConfigurationManager.OpenWebConfiguration per aprire il lettura il Web.config.

domanda:
ma senza l'accessor (come è bello l'inglese  )set il runtime non "dice" nulla?, lo script lo scritto quando tutto era ancora in CTP poi testato e funzionante sulla RTM, il runtime se non erro passava dal set all'avvio della applizaione.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
nostromo ha scritto:
direi ottimo e pulito
anzi è un ottima idee che utilizzerò


Ah, ma allora devi pagarmi le royalty...

in genere uso questa tecnica per alcuni "special case" tipo oggetti vuoti, tanti per risparmiare qualche istanza.


Io uso molto spesso il pattern singleton e classi/metodi statici. Ricordo una frase che andava di moda in ufficio qualche tempo fa: "stateless è bello!" e penso sia vero (quando e se possibile)

p.s. ho aggiunto il metodo WebConfigurationManager.OpenWebConfiguration per aprire il lettura il Web.config.


Sì, ho visto il post di prima.
Se posso esprimere un'opinione: da usarsi con molta cautela!

domanda:
ma senza l'accessor (come è bello l'inglese  )set il runtime non "dice" nulla?, lo script lo scritto quando tutto era ancora in CTP poi testato e funzionante sulla RTM, il runtime se non erro passava dal set all'avvio della applizaione.


No, funziona tutto correttamente. Con 1.x (se non ricordo male) era richiesto (o forse solo più comodo?) dall'handler per inizializzare la classe di configurazione ma con 2 mi funziona. Con beta/ctp/rtm non ricordo...

Cmq. puoi verificare rapidamente: ti basta commentare il set.

Hai notato gli attributi di validazione delle proprietà (sono nel namespace System.Configuration e ne esistono praticamente per tutti i tipi principali)?
Sono comodi anche se a me in generale non piace l'idea di usare reflection per la validazione (e qui Riccardo si arrabbia, visto che è il sistema usato in NorthwindStarterKit!!!)
La mia avversione per reflection va ben oltre gli attributi di validazione... magari si potrebbe aprire una discussione sull'argomento!

ciao marco


Ciao!

Matteo Casati
GURU4.net
scusa se non sono preciso nql quotare, devo partire al volo per andare dalla morosa.

OpenWebConfiguration va usato con molta cautela, anche se devo dire mi è tornato utile per fare il setup al primissimo avvio dell'applicazione, dovevo prendere parti di un xml esistente e salvarle nel web.config.

per l'accessor set farò dei test ho ancora una macchina con una CTP, magari ho preso un abbaglio coadiuvato dalla guida e il set non è necessario se non si usa mai OpenWebConfiguration e tutto il resto


ho usato anche io nelle mie sezioni di configurazione le classe di validazione del namespaces System.Configuration, onestamente nonpiace molto anche a me l'uso della Refection, in questo caso.

anche se riduce di molto il codice scritto e il framework 2.0 il alcuni WebControl ne fa un uso pesante.

attualemente uso una classe "helper" con vari metodi nomignolati "assert", tipo AssertNotNull(object value) ecc ecc

scappo la morosa mi aspetta, chiaccherata stimolante

ciao marco
Modificato da nostromo il 22 marzo 2006 18.34 -

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
Veramente una bella chiaccherata: grazie Marco!

P.S.: sarebbe stato bello sentire anche il parere di qualche altro "esperto" ma ci hanno abbandonati...

Matteo Casati
GURU4.net

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.