Совместное использование конфигураций приложений в решении - PullRequest
3 голосов
/ 17 февраля 2010

У меня есть решение с несколькими выходными проектами (веб-сайт, инструмент администратора и уровень API SOAP).

Каждый из них совместно использует общие проекты в решении (уровень обслуживания, уровень данных и т. Д.). В одном из этих общих проектов я хочу сохранить слой конфигурации.

Сейчас у нас есть три отдельных файла конфигурации appsettings для каждого выходного проекта -

  • development.AppSettings.config
  • testing.AppSettings.config
  • production.AppSettings.config

Итак, всего есть девять конфигурационных файлов. В каждом проекте используется только один, так как на них ссылаются с помощью атрибута configSource в узле appsettings web.config.

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

В общем проекте у нас есть три конфигурационных файла, как указано выше. Они будут установлены для копирования в выходной каталог, чтобы у каждого проекта была их копия. Это будет «базовый» конфиг.

Затем в каждом проекте я хотел бы иметь три файла снова, но они не обязательно должны содержать те же значения, что и базовые конфигурации. Однако, если они это сделали, то значение базовой конфигурации будет переопределено значением в выходной конфигурации проекта. Полагаю, это форма наследования конфигурации.

При запуске приложения я бы хотел получить эти два файла конфигурации - базовый конфигурационный файл и конфигурационный файл проекта. Затем установите соответствующие параметры приложения.

Что мне интересно, каков хороший способ определить, какой файл использовать? Кроме того, мне интересно, является ли это хорошим способом совместного использования значений приложений в большом решении, и если есть другой, возможно, более эффективный способ сделать это?

Если я нахожусь в режиме разработки, то мне не нужен файл production.appsettings.config, и наоборот, если я нахожусь в режиме разработки.

Есть ли простой способ получить режим (разработка / тестирование / производство), в котором я нахожусь, прежде чем я уйду и получу конфигурации?

Ответы [ 3 ]

1 голос
/ 17 февраля 2010

Можно использовать статический метод ConfigurationManager.OpenExeConfiguration . Это позволит вам работать с любым количеством конфигурационных файлов.

Вы также можете попробовать создать собственный класс для хранения всех ваших настроек. Затем вы можете сериализовать ваш объект, чтобы сохранить его в виде файла. Вы можете расширить свой базовый класс конфигурации для всех остальных своих проектов.

1 голос
/ 08 марта 2010

После некоторых тщательных размышлений и поездки в туалет в 03:30 я наткнулся на решение, которое работает.

Допустим, у нас есть некоторые appSettings в нашем базовом конфигурационном файле:

<add key="MyKey1" value="MyValue1" />
<add key="MyKey2" value="MyValue2" />
<!-- And so on... -->
<add key="MyKey5" value="MyValue5" />

И в моем выходном проекте у меня есть три appSettings:

<!-- This is used to identify which config to use. -->
<add key="Config" value="Development" />

<!-- Different value to the one in the base -->
<add key="MyKey2" value="NewValue2" />

<!-- This key does not exist in the base config -->
<add key="MyKey6" value="MyValue6" />

В моем Application_Start у меня есть вызов GetConfigs():

ConfigHelper.GetConfig (HostingEnvironment.MapPath ( "~ / бен / BaseConfig"));

И фактическая функция GetConfigs:

public static void GetConfigs()
{
  if (configMode == null)
  {
    configMode = ConfigurationManager.AppSettings.Get("Config").ToLowerInvariant();
  }

  //Now load the app settings file and retrieve all the config values.
  var config = XElement.Load(@"{0}\AppSettings.{1}.config".FormatWith(directory, configMode))
    .Elements("add")
    .Select(x => new { Key = x.Attribute("key").Value, Value = x.Attribute("value").Value })
    //If the current application instance does not contain this key in the config, then add it.
    //This way, we create a form of configuration inheritance.
    .Where(x => ConfigurationManager.AppSettings.Get(x.Key) == null);

  foreach (var configSetting in config)
  {
      ConfigurationManager.AppSettings.Set(configSetting.Key, configSetting.Value);
  }
}

Теперь мой выходной проект имеет следующие параметры конфигурации:

<add key="Config" value="Development" />
<add key="MyKey1" value="MyValue1" />
<add key="MyKey2" value="NewValue2" />
<!-- And so on... -->
<add key="MyKey5" value="MyValue5" />
<add key="MyKey6" value="MyValue6" />

Simples!

1 голос
/ 17 февраля 2010

Вы можете иметь один набор файлов (3 конфига) и связывать / делиться ими в любых нужных вам проектах.

http://www.devx.com/vb2themax/Tip/18855

Надеюсь, это поможет.

...