2010-09-10 5 views
9

Certains de mes nombres sont des entiers lus à partir d'AppSettings. Quelle est la meilleure façon de faire cela?Lire des entiers à partir d'AppSettings à plusieurs reprises

Plutôt que de le faire à chaque fois:

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

} 

Je pense une méthode dans ma Helpers classe comme ceci:

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

mais cela est juste pour sauver quelques frappes.

Idéalement, j'aimerais les mettre tous dans une sorte de structure que je pourrais utiliser avec intellisense afin que je ne finisse pas avec des erreurs d'exécution, mais je ne sais pas comment j'aborderais cette ... ou si c'est même possible.

Qu'est-ce qu'une méthode d'obtention de bonnes pratiques pour obtenir et lire des entiers à partir de la section AppSettings de Web.Config?

UNE CHOSE ...

Ce ne serait pas une bonne idée de mettre cela comme readonly?

readonly int pageSize = Helpers.GetSettingInt("PAGE_SIZE") ne semble pas fonctionner.

+0

Désolé, mon erreur, ne s'était pas rendu compte qu'il était spécifique à WinForms. –

+0

pas de problème. Votre lien 'Readonly' était utile, cependant. J'aurais dû être plus clair que c'était pour le Web ... car je me rends compte que WinForms utilise "AppSettings" alors que je parle de la section AppSettings du Web.Config – Armstrongest

Répondre

12

J'ai trouvé une réponse à mon problème. Cela implique un travail supplémentaire au début, mais à la fin, cela réduira les erreurs.

Il se trouve à Scott Allen's blog OdeToCode et voici ma mise en œuvre:

Créer une classe statique appelée 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"]); 
    } 
    } 
} 

avantage de le faire sont trois fois:

  • IntelliSense
  • Un point d'arrêt (DRY)
  • Puisque j'écris seulement la chaîne de configuration une seule fois, je fais un int.Parse régulier.

Si quelqu'un change la AppSetting Key, il se brisera, mais je peux gérer cela, car ces valeurs ne sont pas modifiées et la performance est mieux qu'un TryParse et il peut être fixé en un seul endroit.

La solution est si simple ... Je ne sais pas pourquoi je n'y avais pas pensé avant. Appelez les valeurs comme suit:

Config.PageSize 

Config.HighlightedProductId 

Yay!

+0

Bien que cela semble être la meilleure façon de gérer ce problème particulier, je ne sais pas que vous pouvez appeler cela DRY. Chaque nouvel entier que vous ajoutez nécessite à la fois une clé Web.Config et une propriété de classe Config. Si vous n'avez pas besoin de la puissance des transformations de 'Web.Config' (peu probable, parce qu'elles sont utiles), vous pouvez les mettre toutes directement dans la classe Config/Constants, et passer le besoin à int.Parse ( – arserbin3

+0

Que faire si l'utilisateur met une chaîne dans le paramètre de l'application? Cela déclencherait une exception et il n'y aurait pas de gestion des exceptions ou de paramétrage par défaut. – SharpC

-1

Pour éviter de créer une classe de bicyclette, vous pouvez utiliser;

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

Jetez un coup d'œil à T4Config. Je vais générer une interface et une implémentation concrète de vos appsettings et connectionstringsections de votre configuration web/app en utilisant Lazyloading des valeurs dans les types de données appropriés. Il utilise un simple template T4 pour générer automatiquement des choses pour vous.

Questions connexes