ConfigurationManager & Static Class - PullRequest
       4

ConfigurationManager & Static Class

5 голосов
/ 25 августа 2011

Я хотел бы использовать ConfigurationManager для доступа к некоторым строковым значениям из статического класса.Тем не менее, мне нужно конкретно обработать отсутствие значения или наличие пустых значений.Прямо сейчас я использовал инициализаторы типа, такие как

private static readonly string someStr = ConfigurationManager.AppSettings["abc"];

, чтобы сделать работу.Однако, если строка с ключом «abc» не существует в App.config, выполнение будет продолжено со ссылкой null вместо someStr.Каков лучший способ проверки этого значения при инициализации?Статический конструктор, в котором я инициализирую значение, а затем проверяю правильность?Я слышал, что статических конструкторов следует по возможности избегать и заменять инициализаторами типов.

Ответы [ 3 ]

6 голосов
/ 25 августа 2011

Я использую что-то вроде этого:

public static readonly string someStr  = 
        ConfigurationManager.AppSettings["abc"] ?? "default value";

Или для обработки пустой строки:

public static readonly string someStr = 
           !String.IsNullOrEmpty(ConfigurationManager.AppSettings["abc"]) ? 
                             ConfigurationManager.AppSettings["abc"] : "default value";
4 голосов
/ 03 декабря 2015

Это только что появилось в обзоре кода. Предоставленные ответы отлично подходят для строк. Но они не работают для int или double, и т.д ... Сегодня мне нужно было сделать это для подсчета повторов, и это должно быть int.

Итак, вот ответ для тех, кто хочет включить преобразование типов.

Используйте этот метод расширения:

using System.Collections.Specialized;
using System.ComponentModel;

namespace Rhyous.Config.Extensions
{
    public static class NameValueCollectionExtensions
    {
        public static T Get<T>(this NameValueCollection collection, string key, T defaultValue)
        {
            var value = collection[key];
            var converter = TypeDescriptor.GetConverter(typeof(T));
            if (string.IsNullOrWhiteSpace(value) || !converter.IsValid(value))
            {
                return defaultValue;
            }

            return (T)(converter.ConvertFromInvariantString(value));
        }
    }
}

У меня также есть модульные тесты, которые вы можете найти здесь: http://www.rhyous.com/2015/12/02/how-to-easily-access-a-web-config-appsettings-value-with-a-type-and-a-default-value

Надеюсь, это поможет следующему парню.

2 голосов
/ 25 августа 2011

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

Вы также можете использовать оператор объединения (??) для установки значения по умолчанию:

private static readonly string someStr = ConfigurationManager.AppSettings["abc"] ?? "some default value";
...