2010-09-10 2 views
9

Некоторые из них довольно много читаются целыми числами из AppSettings. Каков наилучший способ сделать это?Чтение целых чисел из AppSettings снова и снова

Вместо этого каждый раз, когда:

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

} 

Я думаю метод в моем классе Helpers так:

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

, но это просто, чтобы сохранить некоторые нажатия клавиш.

В идеале, я бы хотел поместить их в какую-то структуру, с которой я мог бы использовать intellisense, поэтому я не получаю ошибки во время выполнения, но я не знаю, как бы я подходил к этому ... или если это возможно.

Каков наилучший способ получения и чтения целых чисел из раздела AppSettings в Web.Config?

ЕЩЕ ОДИН ВЕЩЬ ...

не было бы хорошей идеей, чтобы установить это как readonly?

readonly int pageSize = Helpers.GetSettingInt("PAGE_SIZE"), похоже, не работает.

+0

Извините, моя ошибка не знала, что это определенно WinForms. –

+0

без проблем. Однако ваша ссылка «Readonly» была полезной. Я должен был быть более ясным, что это было для Сети ... поскольку я понимаю, что WinForms использует «AppSettings», тогда как я говорю о разделе AppSettings в Web.Config – Armstrongest

ответ

12

Я нашел ответ на свою проблему. Сначала это требует дополнительной работы, но, в конце концов, это уменьшит количество ошибок.

Он находится в Scott Allen's blog OdeToCode и вот моя реализация:

Создать статический класс с именем 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"]); 
    } 
    } 
} 

Преимущество этого являются три раза:

  • Intellisense
  • Одна точка останова (DRY)
  • Поскольку я только пишу Config String ONCE, я делаю обычный int.Parse.

Если кто-то изменяет AppSetting ключ, он будет перерыв, но я могу справиться с этим, так как эти значения не изменились, и производительность лучше, чем TryParse, и он может быть установлен в одном месте.

Решение такое простое ... Я не знаю, почему я раньше не думал об этом. Вызвать такие значения:

Config.PageSize 

Config.HighlightedProductId 

Yay!

+0

Хотя это, кажется, лучший способ обработки эта конкретная проблема, я не знаю, что вы можете назвать это СУХОЙ. Каждое новое целое число, которое вы добавляете, требует как ключа 'Web.Config', так и свойства класса' Config'. Если вам не нужны полномочия преобразования Web.Config (маловероятно, потому что они полезны), вы можете поместить их все непосредственно в класс Config/Constants и пропустить необходимость в int.Parse () – arserbin3

+0

Что делать, если пользователь помещает строку в настройках приложения? Это вызовет исключение, и не будет обработки исключений или настроек по умолчанию. – SharpC

-1

Чтобы избежать создания велосипедного класса, который вы могли бы использовать;

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

Посмотрите на T4Config. Я создам интерфейс и конкретную реализацию ваших настроек appsettings и connectionstrings из вашего web/app config, используя Lazyloading значений в соответствующих типах данных. Он использует простой шаблон T4 для автоматического создания вещей для вас.

Смежные вопросы