Переопределить настройки конфигурации - PullRequest
10 голосов
/ 29 июня 2011

У меня есть файл конфигурации, который используется в нескольких проектах, general.config, выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<appSettings>
   <add key="mykey1" value="myvalue1"/>    
   <add key="mykey2" value="myvalue2"/>
</appSettings>

В одном из проектов мне нужно переопределить один из двух параметров.Таким образом, app.config этого проекта выглядит так:

<?xml version="1.0"?>
<configuration>
  <appSettings file="general.config">
    <remove key="mykey1"/>
    <add key="mykey1" value="anothervalue"/>
    <add key="mykey3" value="myvalue3"/>
  </appSettings>  
</configuration>

Но remove здесь не работает.Как я могу переопределить mykey1 без прерывания mykey2?add работает в этом случае.Я могу получить myvalue3 из ConfigurationManager.

РЕДАКТИРОВАТЬ: general.config копируется в выходную папку автоматически при компиляции.Не волнуйтесь о проблеме пути.В настоящее время я получил:

ConfigurationManager.AppSettings["mykey1"] 
     //I got "myvalue1", but I want "anothervalue" here
     //that is, this item is "overrided", just like virtual methods in C#
ConfigurationManager.AppSettings["mykey2"] 
     //this setting will not be modified, currently it works fine
ConfigurationManager.AppSettings["mykey3"]   //good 

Ответы [ 4 ]

3 голосов
/ 29 июня 2011

Мой друг ответил на этот вопрос. От MSDN :

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

Таким образом, в этом вопросе настройки в general.config переопределяют элементы в app.config, что отличается от того, что я думаю (хочу) app.config items переопределяет элементы в general.config. Теперь я думаю, что должен решить эту проблему в коде C # (это неизбежно будет выглядеть ужасно).

1 голос
/ 15 ноября 2017

Использование атрибута file для загрузки общих настроек с ожиданием того, что ключи, добавленные непосредственно к элементу <appSettings>, отменит эти общие настройки, понятно, но, к сожалению, это не так.

Намерение Microsoft состояло в том, чтобы атрибут file загружал общие настройки, которые переопределяют настройки отдельного приложения.

Это обсуждается более подробно в Документации Microsoft

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

var config = ConfigurationManager.AppSettings["MSG_QUEUE_PROVIDER_OVERRIDE"]
    ?? ConfigurationManager.AppSettings["MSG_QUEUE_PROVIDER"]
    ?? "ActiveMQ";

<appSettings file="common.config"> 
    <!-- Override the common values -->
    <add key="MSG_QUEUE_PROVIDER_OVERRIDE" value="RabbitMQ"/>
</appSettings>
0 голосов
/ 29 июня 2011

Вы можете добавить еще один файл конфигурации, скажем Test.config.

<appSettings>
   <add key="mykey1" value="New value"/>
</appSettings>

, и в разделе app.config appsettings будет выглядеть так

<appSettings file="Test.config">
   <add key="mykey1" value="myvalue1"/>
</appSettings>
0 голосов
/ 29 июня 2011

Элементы изменены от дочерних, и я имею в виду то, что в настоящее время ваш app.config является родительским файлом, а значения заменяются на существующие в General.config

, так как вы используете remove в родительском файле он эффективно удаляет элемент, который вы указали в app.config, но после этого вставляются элементы из general.config. Теперь скажите здесь, в General.config, вы говорите, что удалить mykey3, который находится на вашемВ app.config вы увидите, что в окончательной коллекции нет ключа: mykey3.

Короче говоря, это не сработает.Надеюсь, это помогло вам.

...