получить определенное свойство из app.config без зацикливания - PullRequest
0 голосов
/ 18 августа 2011

мне нужна твоя помощь

У меня app.config вот так

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    ...
  </configSections>
  <connectionStrings>
    ...
  </connectionStrings>
  <appSettings />
  <userSettings>
    <MySettings>
      <setting name="Precision" serializeAs="String">
        <value>0</value>
      </setting>
    </MySettings>
  </userSettings>
  <applicationSettings>
    ...
  </applicationSettings>
</configuration>

мне нужно получить значение «Precision». как получить это без зацикливания SectionGroups, SectionCollection?

примечание: У меня есть DAL, и в моем DAL эта точность нужна для форматирования десятичного значения, а точность управляется пользователем (клиентом) через уровень представления. Я сохраняю значение точности в app.config. Проблема, app.config находится на уровне представления, и я не могу использовать Properties.MySetting.Default.Precision, чтобы получить это. (Спасибо Branko & Tim, чтобы напомнить мне об этой причине)

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Я хотел бы рассмотреть «внедрение параметров» здесь - как внедрение зависимостей, но для параметров:)

Предположительно, ваша точка входа настраивает всю систему ... так что получите it , чтобы прочитать всенастройки из app.config и используйте их при создании и настройке DAL (и в любом другом месте, где требуются настройки).Единственная часть кода, которая должна знать, как использовать app.config, может быть точкой входа.Все остальное можно указать с помощью POCO, отдельных параметров конструктора и т. Д.

Это хорошо по нескольким причинам:

  • Ваш код будет проще тестировать: для проверки различных настроек достаточно просто пройтив разных аргументах конструктора.Нет необходимости в файлах и т. Д.
  • Ваша непосредственная проблема решена: DAL больше не нужно просматривать файл настроек
  • Вы изолируете хранилище конфигурации в одном месте, которое может измениться, есливы решили (скажем) использовать другой формат XML или формат конфигурации в стиле "ini"
0 голосов
/ 11 сентября 2011

Если я правильно понял ответ Джона, он выглядит следующим образом:

public interface IConfigurationWrapper
{
  IDictionary<string, string> Properties { get; }
  T GetSection<T>(string name) where T : ConfigurationSection;
}

public class ConfigurationWrapper : IConfigurationWrapper
{
  // implementation with with ConfigurationManager.GetSection or just placeholders
}

public interface IProduct
{
  string Name { get; }
}

public class Product : IProduct
{
  readonly IConfigurationWrapper m_configuration;

  public Product(string key, IConfigurationWrapper configuration)
  {
    m_configuration = configuration;
  }

  public string Name
  {
    get { // use m_configuration to get name from .config }
  }
}

public class ProductFactory
{
  readonly IConfigurationWrapper m_configuration;

  public ProductFactory(IConfigurationWrapper configuration)
  {
    m_configuration = configuration;
  }

  public IProduct CreateProduct(string key)
  {
    return new Product(key, m_configuration);
  }
}

и использование выглядит следующим образом:

var config = new ConfigurationWrapper();
var factory = new ProductFactory(config);
var product = factory.CreateProduct("myproductkey");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...