Использование значений из файла AppConfig в C # - PullRequest
5 голосов
/ 08 июня 2011
selenium = new DefaultSelenium(
    ConfigurationManager.AppSettings["TestMachine"].ToString(),
    4444,       
    ConfigurationManager.AppSettings["Browser"].ToString(),        
    ConfigurationManager.AppSettings["URL"].ToString()
);

Есть ли эффективный способ сделать это вместо повторения:

ConfigurationManager.AppSettings[""].ToString()

Ответы [ 8 ]

4 голосов
/ 08 июня 2011

Я думаю, что лучшая идея - написать класс-оболочку для всего, что имеет дело с конфигурацией, особенно если вы пишете тесты. Простой пример может быть:

public interface IConfigurationService
{
    string GetValue(string key);
}

Этот подход позволит вам смоделировать вашу конфигурацию, когда вам это нужно, и уменьшить сложность

Итак, вы можете продолжить:

public void SelTest(IConfigurationService config)
{
    var selenium = new DefaultSelenium(config.GetValue("TestMachine"),
        4444, config.GetValue("Browser"), config.GetValue("URL"));
}

или вы можете унаследовать свою конфигурацию из списка и уменьшить число набранных до:

config["Browser"]
1 голос
/ 08 июня 2011

Если вы хотите иметь строгую ссылку на тип, вы можете наследовать от ConfigurationSection / ConfigurationElementCollection и ConfigurationElement.

Можно указать значение по умолчанию ConfigurationElement с помощью [ConfigurationProperty("key", IsRequired = true, DefaultValue = "*^%)(@")] и валидатор, например [StringValidator(MinLength = 3)] и т. Д.

1 голос
/ 08 июня 2011

Я всегда создаю класс конфигурации для приложения, который оборачивает доступ к файлу app / web.config и выставляет записи конфигурации в качестве свойств. Например. как то так:

public static class MyConfig
{
    /// documentation of config entry
    public static string Browser
    {
      get { return Read("Browser", "some default value"); }
    }

    /// documentation of config entry
    public static int Port
    {
      get { return int.Parse(Read("Browser", "80")); }
    }

    public static string Read(string entry, string defaultValue)
    {
        var entry = ConfigurationManager.AppSettings[entry];
        return string.IsNullOrEmpty(entry) ? defaultValue : entry;
    }
}

Это имеет несколько преимуществ:

  • Я могу определить значения по умолчанию (например, если запись конфигурации необязательна / отсутствует)
  • Я могу предоставить числовые / логические записи конфигурации в правильном типе (int, bool)
  • Я могу документировать все записи конфигурации в центральном месте
1 голос
/ 08 июня 2011

Вы можете перейти к свойствам проекта и добавить настройки, а затем прочитать их с помощью: Properties.Settings.Default.Property

1 голос
/ 08 июня 2011

Да, вы можете сделать

ConfigurationManager.AppSettings[""]

Поскольку это уже строка.

Если вы используете ConfigurationManager.AppSettings ["Something"] в нескольких местах, вы должны создатьстатический класс Config, который читает ваши AppSettings через статические свойства.

0 голосов
/ 08 июня 2011

Возможно, вам нужно быть немного более креативным с именем класса, но вы могли бы сделать что-то вроде:

class ConfigManager
{
    public static string GetSetting(string name)
    {
        return ConfigurationManager.AppSettings[name].ToString();
    }
}
0 голосов
/ 08 июня 2011

Единственный «более эффективный» способ извлечь файл конфигурации - это использовать весь раздел, а затем выполнить итерацию по вашему желанию. Поскольку вы в конечном итоге зацикливаете код, он вряд ли будет более эффективным, чем метод, который вы используете сейчас.

Один шаблон, который нужно использовать для упрощения, - это создать синглтон «Настройки приложения» и загрузить его при загрузке приложения. По сути, вы создаете общую хеш-таблицу (словарь и т. Д.) Из строки, строки, чтобы вам было проще выполнять поиск. Но все еще есть издержки копирования в раздел настроек приложения.

0 голосов
/ 08 июня 2011

Напишите вспомогательную функцию для получения параметра.Вам нужно проверить, действительно ли ключ присутствует в первую очередь для правильной практики кодирования.

...