Подтвердить что ты не робот

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

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

Возможно ли это?

4b9b3361

Ответ 1

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

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

Приложение 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> и не встроен в структуру конфигурации. В ваших собственных разделах конфигурации можно реализовать аналогичный атрибут. Это будет обсуждаться в будущем выпуске расширенных тем конфигурации после нескольких предварительных платежей;).