У меня есть стандартные блоки записи, NHibernate и т.д. в моем app.config, и я хотел бы извлечь их в общий файл XML, который может быть включен в качестве ссылки всеми файлами моих приложений app.config.
Возможно ли это?
У меня есть стандартные блоки записи, NHibernate и т.д. в моем app.config, и я хотел бы извлечь их в общий файл XML, который может быть включен в качестве ссылки всеми файлами моих приложений app.config.
Возможно ли это?
Да, вы можете использовать атрибут 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>и не встроен в структуру конфигурации. В ваших собственных разделах конфигурации можно реализовать аналогичный атрибут. Это будет обсуждаться в будущем выпуске расширенных тем конфигурации после нескольких предварительных платежей;).