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

StackOverflow https://stackoverflow.com/questions/19355

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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


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

Это было полезно?

Решение

AppSettings можно переопределить с помощью локального файла:

<appSettings file="localoveride.config"/>

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

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

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

Другие советы

Редактировать:Может ли метод «файла», предложенный @Jonathon, как -то использовать в разделе ConnectionStrings?

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

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;
    }
}

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

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

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

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

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

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

непростая задача:

<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>

Можно ли как-то использовать метод «файл», предложенный @Jonathon, с разделом ConnectionStrings?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top