Используйте XML-ссылки или ссылки на конфигурацию в app.config, чтобы включить параметры других файлов конфигурации.

В моем app.config есть стандартные блоки протоколирования, NHibernate и т. Д., И я хотел бы извлечь их в общий XML-файл, который можно включить в качестве ссылки во все app.config файлы моих приложений.

Это возможно?


person TheSoftwareJedi    schedule 26.01.2009    source источник


Ответы (1)


Да, вы можете использовать атрибут configSource блока конфигурации. Этот атрибут есть у всех блоков конфигурации, хотя он не задокументирован.

См. эту статью, полностью внизу, приложение B. Я также вставил соответствующий раздел ниже:

Приложение Б: включая внешние файлы конфигурации

Несмотря на все великолепие возможностей конфигурации .NET 2.0, есть один недостаток. При работе над одним проектом в нескольких средах управление конфигурацией может стать кошмаром. Процесс управления несколькими версиями файла конфигурации для нескольких сред - т. Е. Разработка, тестирование, постановка и производство - в моей текущей работе включает в себя ручное сравнение .config файлов всякий раз, когда изменения развертываются в той или иной среде, с ручным процессом слияния . Я потратил месяцы, пытаясь найти лучший способ, и в конце концов нашел его. Введите одну из тех ох-так любимых «недокументированных» - или, в данном случае, просто плохо документированных - функций, которыми так славится Microsoft: configSource. Я наткнулся на эту жемчужину только тогда, когда копался в исходном коде конфигурации .NET 2.0 с помощью Reflector, замечательного маленького инструмента.

Каждому разделу конфигурации, когда он анализируется и загружается классами конфигурации .NET, назначается объект SectionInformation. Объект SectionInformation содержит метаинформацию о разделе конфигурации и позволяет управлять тем, как разделы переопределяют друг друга, если они определены в дочернем файле конфигурации (ASP.NET). На данный момент мы проигнорируем большую часть того, что может предложить SectionInformation, за исключением свойства ConfigSource. Добавляя атрибут configSource к корневому элементу любого ConfigurationSection, вы можете указать альтернативный внешний источник, из которого будут загружены параметры конфигурации.

<!-- SomeProgram.exe.config -->
<configuration>
  <connectionStrings configSource="externalConfig/connectionStrings.config"/>
</configuration>

<!-- externalConfig/connectionStrings.config -->
<connectionStrings>
  <add name="conn" connectionString="blahblah" />
</connectionStrings>

В приведенном выше файле конфигурации раздел <connectionStrings> был получен из файла с именем externalConfig/connectionStrings.config. Все строки подключения приложения будут загружены из указанного файла. Теперь, когда строки подключения загружены из внешнего ресурса, относительно просто создать connectionStrings.config файл в каждой среде в одном и том же относительном местоположении. Следовательно, externalConfig/ часть пути connectionStrings.config. Прелесть здесь в том, что мы можем правильно определить строки подключения для каждой среды один раз. Нам не нужно беспокоиться о случайном переопределении этих параметров во время развертывания, когда файл конфигурации был либо неправильно объединен, либо не объединен вообще. Это может быть огромным благом при развертывании изменений в приложении в производственной среде, где критически важно наличие правильных строк подключения к базе данных. Недостатком использования атрибута configSource является то, что он требует, чтобы все параметры конфигурации были помещены во внешний файл. Невозможно наследование или переопределение, что в некоторых случаях делает их бесполезными. Все внешние файлы конфигурации, используемые с атрибутом configSource, также должны находиться в относительном дочернем пути к основному .config файлу. Я считаю, что это связано с проблемами безопасности при хранении файла по относительному родительскому пути в веб-среде.

Еще следует отметить, что в разделе <appSettings> есть лучшая альтернатива использованию configSource, называемая файлом. Если вы используете атрибут файла, а не configSource с разделом <appSettings>, вы можете определить настройки как в корневом .config файле, так и в указанном файле. Настройки из корневого .config файла также могут быть переопределены в указанном файле, просто добавив что-то с тем же ключом. К сожалению, атрибут файла доступен только в разделе <appSettings> и не встроен в структуру конфигурации. Можно реализовать аналогичный атрибут в собственных разделах конфигурации. Это будет обсуждаться в следующей части дополнительных тем по настройке, после нескольких предварительных статей;).

person TheSoftwareJedi    schedule 26.01.2009
comment
you can use the configSection attribute - Я так понимаю, вы имеете в виду configSource? - person Geoff; 26.08.2016
comment
Как я только что выяснил, следует отметить, что это должен быть физический путь и не может быть путем UNC: ( - person Perry; 23.01.2017