Как управлять настройками конфигурации для каждого разработчика

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

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


Редактировать: Может ли метод " file", предложенный @Jonathon, каким-то образом использоваться с connectionStringsразделом?

21.08.2008 04:59:53
5 ОТВЕТОВ
РЕШЕНИЕ

AppSettings может быть переопределен локальным файлом:

<appSettings file="localoveride.config"/>

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

Что касается строки подключения, в идеальном мире все разработчики должны подключаться к тестовой БД, а не запускать SQL Server каждый.

Однако я считаю, что лучше всего сохранить файл с именем Web.Config.Prd в системе контроля версий и использовать его для развертываний сборок. Если кто-то изменяет web.config, он также должен добавить изменение в файл .PRD ... Там нет хорошей автоматизации :(

4
21.08.2008 05:05:24

Я всегда делаю шаблоны для своих конфигурационных файлов.

В качестве примера я использую NAnt для построения своих проектов. У меня есть зарегистрированный файл с именем local.properties.xml.template. Моя сборка NAnt предупредит разработчика, если local.properties.xml не существует. Внутри этого файла будут определенные настройки рабочей станции. Шаблон будет проверен в системе контроля версий, но фактическая конфигурация не будет.

0
21.08.2008 05:02:51

Я использую довольно архаичный дизайн, который просто работает.

  • /_Test__app.config
  • /_Prod__app.config
  • /app.config

Затем в моем скрипте nant у меня есть задача, которая копирует текущую среду сборки плюс _ app.config и копирует ее в app.config.

Это неприятно, но вы не можете попасть между провайдерами и ConfigurationManager, чтобы подделать его, сказав, что провайдеры смотрят на строку подключения «dev» или «prod» и просто имеют 3 именованные строки подключения.

Nant задача:

<target name="copyconfigs" depends="clean">
  <foreach item="File" property="filename" unless="${string::get-length(ConfigPrefix) == 0}">
   <in>
     <items>
       <include name="**/${ConfigPrefix}App.config" />
       <include name="**/${ConfigPrefix}connectionstrings.config" />
       <include name="**/${ConfigPrefix}web.config" />
     </items>
   </in>
   <do>
    <copy overwrite="true" file="${filename}" tofile="${string::replace(filename, ConfigPrefix,'')}" />
   </do>
  </foreach></target>
0
21.08.2008 05:09:55

Может ли метод "file", предложенный @Jonathon, каким-то образом использоваться с разделом connectionStrings?

Нет, но ничто не мешает вам сохранить ConnectionString как ключ AppSettings.

0
21.08.2008 05:33:47

Редактировать: Может ли метод "file", предложенный @Jonathon, каким-то образом использоваться с разделом connectionStrings?

Или вы можете иметь несколько строк подключения в файле config с проверкой и использовать ключ AppSettings, чтобы определить, какую ConnectionString следует использовать. Для этого у меня в коде есть следующее:

public class ConnectionString
{
    public static string Default
    {
        get 
        { 
            if (string.IsNullOrEmpty(ConfigurationManager.AppSettings["DefaultConnectionStringName"]))
                throw new ApplicationException("DefaultConnectionStringName must be set in the appSettings");

            return GetByName(ConfigurationManager.AppSettings["DefaultConnectionStringName"]);
        }
    }

    public static string GetByName(string dsn)
    {
        return ConfigurationManager.ConnectionStrings[dsn].ConnectionString;
    }
}
3
21.08.2008 05:42:28