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