Условные настройки приложения .NET - PullRequest
3 голосов
/ 21 июля 2009

У меня есть клиент-серверное приложение, в котором есть два варианта для сервера - автономный исполняемый файл или другой домен клиента в клиенте, что очень удобно для целей отладки. Выбор сервера прозрачен для клиента, единственный файл, который необходимо изменить, - это клиентский файл app.config.

Чтобы переключиться с автономного сервера на локальный, некоторые разделы должны быть без комментариев (например, конфигурация nhibernate, которая имеет отношение только к серверу) вместе с отдельными настройками (такими как реализация аутентификации, которая снова только отношение к серверу).

На данный момент переключение между этими двумя режимами является утомительным и подверженным ошибкам, поскольку необходимо (не) комментировать несколько разделов и отдельные настройки.

Есть ли способ указать условные настройки / разделы в app.config? Или, может быть, есть способ включить другой файл конфигурации в app.config? Таким образом, мы могли бы поместить все специфичные для локального сервера настройки в другой файл и только (не) комментировать его включение.

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

Конечная нота. Описанный сценарий явно не для производства. Он используется исключительно для запуска модульных тестов. Мы используем mstest для наших модульных тестов.

Спасибо.

Ответы [ 8 ]

4 голосов
/ 21 июля 2009

В ASP.NET возможно иметь некоторые настройки во внешнем файле (но я не уверен, что это также доступно в приложениях Windows):

Обновление : это также работает для консольных / winforms приложений.

web.config / app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <!-- comment one of the following two lines -->

  <!--appSettings-->
  <appSettings file="YourSettings.config">

    <add key="KeyToOverride" value="Original" />
    <add key="KeyToNotOverride" value="Standard" />

  </appSettings>
</configuration>

YourSettings.config:

<appSettings>
  <add key="KeyToOverride" value="Overridden" />
  <add key="KeyToBeAdded" value="EntirelyNew" />
</appSettings>
3 голосов
/ 31 июля 2009

Для вашего обычного appSettings нормой было бы использовать это:

<appSettings file="appSettings.config" />

Для других разделов вы можете использовать

<mySection configSource="mySection.config" />

У вас должен быть файл на раздел, и configSource будет работать только с относительными путями.

В вашем конкретном случае я бы порекомендовал папку для каждой настройки / конфигурации.

<mySection1 configSource="setup1\mySection1.config" />
<mySection2 configSource="setup1\mySection2.config" />

Затем вы можете вручную сделать текст «найти и заменить» в имени папки, чтобы переключиться между настройками, или запустить пакетный файл или шаг сборки, который переключает папку в файловой системе (то есть скопировать папку setup1 в папку currentSetup )

Обратите внимание, что вы не можете использовать configSource для system.serviceModel, но вы можете использовать его для подразделов

1 голос
/ 30 июля 2009

System.Configuration поддерживает включаемые файлы с атрибутом configsource. Смотрите здесь http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.configsource.aspx или здесь http://rizwanshah.blogspot.com/2007/10/use-configsource-attribute-to-manage.html

Вы можете использовать его так:

<SomeSection configSource="myOtherFile.config" />

Мы использовали для добавления различных разделов в декларативную конфигурацию wcf и т. Д. /

1 голос
/ 21 июля 2009

Файл app.config или web.config может ссылаться на внешний файл конфигурации.

<configuration>
  <appSettings file="external.config">
  </appSettings>
</configuration>

MSDN appSettings reference

1 голос
/ 21 июля 2009

Добавьте новый параметр - AppType = Server / Standalone - продублируйте каждый параметр в App.Config, который изменяется в зависимости от Server / Standalone, так что есть только 1 app.config независимо от Server / Standalone. Переместите условные варианты в ваше приложение.

if(AppType == ApplicationType.Server)
{
   Setup(NHibernate);
   Setup(Authentication Implementation);
}
else
{
   Setup(Standalone app stuff);
}
1 голос
/ 21 июля 2009

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

Создайте событие предварительной сборки, определяющее тип выполняемой конфигурации сборки, а затем создайте файл «app.config», скопировав специальный файл конфигурации и присвоив ему имя «app.config».

0 голосов
/ 31 июля 2009

Простой ответ: просто используйте аргумент командной строки. В настоящее время я работаю над проектом, который должен переключаться между «локальным» (для целей тестирования / отладки) и «серверным» (когда я развертываю его на рабочей машине). Я просто передаю визуальную студию 'local' в качестве аргумента командной строки, когда я нахожусь в режиме отладки, и использую наличие этого аргумента для настройки программного обеспечения во время выполнения, чтобы делать то, что мне нужно.

Отсутствие какого-либо аргумента приводит к тому, что программное обеспечение ведет себя так, как будто оно работает. Когда программное обеспечение будет готово к выпуску, я просто полностью уберу логику аргументов.

0 голосов
/ 21 июля 2009

nAnt может быть другим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...