Переменные в app.config / web.config - PullRequest
82 голосов
/ 02 марта 2009

Можно ли сделать что-то подобное в файлах app.config или web.config?

<appSettings>
 <add key="MyBaseDir" value="C:\MyBase" />
 <add key="Dir1" value="[MyBaseDir]\Dir1"/>
 <add key="Dir2" value="[MyBaseDir]\Dir2"/>
</appSettings>

Затем я хочу получить доступ к Dir2 в своем коде, просто сказав:

 ConfigurationManager.AppSettings["Dir2"]

Это поможет мне, когда я установлю свое приложение на разных серверах и в других местах, где мне нужно будет только изменить ОДНУ запись в моем полном app.config. (Я знаю, что могу управлять всей конкатенацией в коде, но я предпочитаю это так).

Ответы [ 15 ]

0 голосов
/ 24 июня 2015

Я придумал это решение:

  1. В приложении Settings.settings я определил переменную ConfigurationBase (с типом = строка Область = Приложение)
  2. Я ввел переменную в целевые атрибуты в Settings.settings, все эти атрибуты должны были быть установлены в Scope = User
  3. В app.xaml.cs я зачитываю значение, если ConfigurationBase
  4. В app.xaml.cs я заменил все переменные значением ConfigurationBase. Чтобы заменить значения во время выполнения, атрибуты должны были быть установлены в Scopr = User

Я не очень доволен этим решением, потому что мне приходится менять все атрибуты вручную, если я добавляю новый, я должен учитывать его в app.xaml.cs.

Вот фрагмент кода из App.xaml.cs:

string configBase = Settings.Default.ConfigurationBase;
Settings.Default.CommonOutput_Directory = Settings.Default.CommonOutput_Directory.Replace("${ConfigurationBase}", configBase);

UPDATE

Только что найдено улучшение (снова фрагмент кода из app.xaml.cs):

string configBase = Settings.Default.ConfigurationBase;

foreach (SettingsProperty settingsProperty in Settings.Default.Properties)
{
    if (!settingsProperty.IsReadOnly && settings.Default[settingsProperty.Name] is string)
    {
        Settings.Default[settingsProperty.Name] = ((string)Settings.Default[settingsProperty.Name]).Replace("${ConfigurationBase}", configBase);
    }
}

Теперь замены работают для всех атрибутов в моих настройках, которые имеют Type = string и Scope = User. Думаю, мне так нравится.

UPDATE2

Видимо, установка Scope = Приложение не требуется при работе со свойствами.

0 голосов
/ 03 ноября 2009

Я бы порекомендовал следовать решению Мэтта Хэмсмита. Если это проблема для реализации, то почему бы не создать метод расширения, который реализует это в фоновом режиме в классе AppSettings?

Что-то вроде:

    public static string GetValue(this NameValueCollection settings, string key)
    {

    }

Внутри метода, который вы ищете через DictionaryInfoConfigSection с помощью Linq и возвращаете значение с соответствующим ключом. Вам нужно будет обновить файл конфигурации, например, так:

<appSettings>
  <DirectoryMappings>
    <DirectoryMap key="MyBaseDir" value="C:\MyBase" />
    <DirectoryMap key="Dir1" value="[MyBaseDir]\Dir1"/>
    <DirectoryMap key="Dir2" value="[MyBaseDir]\Dir2"/>
  </DirectoryMappings>
</appSettings>
0 голосов
/ 02 марта 2009

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

0 голосов
/ 02 марта 2009

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

<appSettings file="..\OverrideSettings.config">
0 голосов
/ 02 марта 2009

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

...