2010-09-10 8 views
9

Alcuni eseguo parecchio sono letti da AppSettings. Qual'è il miglior modo per farlo?Lettura di interi da AppSettings più e più volte

Piuttosto che fare questo ogni volta:

int page_size; 
if (int.TryParse(ConfigurationManager.AppSettings["PAGE_SIZE"], out page_size){ 

} 

sto pensando un metodo nella mia classe di Helpers in questo modo:

int GetSettingInt(string key) { 
    int i; 
    return int.TryParse(ConfigurationManager.AppSettings[key], out i) ? i : -1; 
} 

ma questo è solo per salvare alcune combinazioni di tasti.

Idealmente, mi piacerebbe metterli tutti in una sorta di struttura che potrei usare intellisense con così non finisco con errori di run-time, ma non so come mi avvicinerei a questo ... o se questo è anche possibile.

Qual è un modo migliore per ottenere e leggere numeri interi dalla sezione AppSettings di Web.Config?

un'altra cosa ...

non sarebbe una buona idea per impostare questo come readonly?

readonly int pageSize = Helpers.GetSettingInt("PAGE_SIZE") non sembra funzionare.

+0

Mi dispiace, errore mio, non avevo capito che era specifico di WinForms. –

+0

nessun problema. Il tuo link 'Readonly' era utile, però. Avrei dovuto essere più chiaro che era per il Web ... mentre realizzo che WinForms usa "AppSettings" mentre sto parlando della sezione AppSettings del Web.Config – Armstrongest

risposta

12

Ho trovato una risposta al mio problema. In un primo momento comporta un lavoro extra, ma alla fine ridurrà gli errori.

Si trova a Scott Allen's blog OdeToCode e qui è la mia realizzazione:

Creare una classe statica denominata Config

public static class Config { 

    public static int PageSize { 
     get { return int.Parse(ConfigurationManager.AppSettings["PAGE_SIZE"]); } 
    } 
    public static int HighlightedProductId { 
    get { 
     return int.Parse(ConfigurationManager.AppSettings["HIGHLIGHT_PID"]); 
    } 
    } 
} 

vantaggio di questa operazione sono di tre tipi:

  • Intellisense
  • One breakpoint (DRY)
  • Dato che sto scrivendo solo la stringa di configurazione, faccio un normale int.Parse.

Se qualcuno cambia la chiave appSetting, si romperà, ma in grado di gestire che, in quanto tali valori non sono cambiati e le prestazioni è meglio di un TryParse e può essere fissato in una posizione.

La soluzione è così semplice ... Non so perché non ci ho pensato prima. Chiama i valori in questo modo:

Config.PageSize 

Config.HighlightedProductId 

Yay!

+0

Mentre questo sembra essere il modo migliore di gestire questo particolare problema, non so che si può chiamare questo ASCIUTTO. Ogni nuovo intero che aggiungi richiede sia una chiave 'Web.Config' che una proprietà' Config'. Se non è necessario il potere delle trasformazioni 'Web.Config' (improbabile, perché sono utili), è possibile inserirli tutti direttamente nella classe Config/Constants e saltare la necessità di int.Parse () – arserbin3

+0

Cosa succede se l'utente inserisce una stringa nell'impostazione dell'app? Ciò genererebbe un'eccezione e non vi è alcuna gestione delle eccezioni o impostazione predefinita. – SharpC

-1

Per evitare di creare un corso di bicicletta che è possibile utilizzare;

System.Configuration.Abstractions method .AppSettings.AppSetting<int>("intKey");https://github.com/davidwhitney/System.Configuration.Abstractions 
0

Dai uno sguardo allo T4Config. Genererò un'interfaccia e un'implementazione concreta delle vostre appettings e connessionitringsections della vostra configurazione web/app utilizzando Lazyloading dei valori nei tipi di dati corretti. Usa un semplice template T4 per generare automaticamente le cose per te.