Файлы конфигурации, содержащие настройки среды - PullRequest
2 голосов
/ 06 октября 2009

В моей организации у нас есть несколько сред (Dev, QA, Stage, Prod, Disaster Recovery), и я хотел бы, чтобы мои файлы app / web.config не содержали специфических для среды деталей в URI, строках соединений и т. Д. Мой предпочтительный подход будет выполнять замену во время выполнения, например, Вместо этого:

<endpoint address="http://MyDevWebServer/SomeService" binding="basicHttpBinding"...

Я бы предпочел что-то вроде этого:

<endpoint address="http://{Env:WebServerName}/SomeService" binding="basicHttpBinding"...

Это просто для настроек конфигурации, считываемых из классов, которые я контролирую (просто предоставьте оболочку, которая выполняет замену {Env: WebServerName} действительным именем сервера для этой среды), но я также хочу, чтобы эта замена выполнялась, когда настройки чтение из классов я не могу контролировать (например, WCF, NHibernate и т. д.). Кто-нибудь знает способ введения такого рода логики замещения. Я предполагаю, что подход AOP может быть возможен, но лично у меня нет большого опыта работы с инфраструктурами AOP.

Ответы [ 6 ]

1 голос
/ 06 октября 2009

У нас есть скрипт nant после сборки, который использует XPath для определения и замены специфических для среды значений в зависимости от того, на какую среду мы нацеливаемся. Все значения конфигурации по умолчанию предназначены для среды разработки. Это добавляет небольшую задержку к процессу сборки, но на практике оказалось очень надежным решением, то есть без перепутанных или пересекающихся настроек среды.

1 голос
/ 06 октября 2009

Один из подходов заключается в использовании ConfigSource для раздела конфигурации (appSettings, connectionStrings и т. Д.). См. http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx для получения дополнительной информации об этом. Таким образом, файл web / app.config может содержать информацию о ядре, а уникальные параметры среды могут быть установлены в файле для этой среды.

1 голос
/ 06 октября 2009

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

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

0 голосов
/ 06 октября 2009

Пока вы пытаетесь найти способ выполнения замены во время выполнения, я бы предположил, что в этом случае лучшим решением будет замена во время сборки. Например, мы используем задачу nant xmlpoke для замены значений конфигурации во время сборки. Вы также можете попробовать заменить раздел web.config в проектах веб-развертывания или Задача XmlMassUpdate из задач сообщества MSBuild ( пример ).

0 голосов
/ 06 октября 2009

Я полностью согласен с тем, что такая замена была бы желательна, и запросил эту функцию в Microsoft Connect .

Тем не менее, небольшой интерес со стороны Microsoft: (

0 голосов
/ 06 октября 2009

Мы перенесли наш параметр в базу данных, и с тех пор нам не приходилось с этим сталкиваться, см. здесь.

...