Как управлять настройками конфигурации для каждого разработчика
-
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.