Переопределить ConnectionStrings в app.config (или web.config) - PullRequest
2 голосов
/ 18 декабря 2009

Есть ли способ переопределить ConnectionString в app.config. Наша сборочная система работает также на сервере клиента, но там должна быть другая строка соединения. Поскольку app.config находится в svn, каждый раз, когда я что-то изменяю в app.config и фиксирую это, мне нужно идти на сервер клиента, чтобы изменить connectionString обратно в его базу данных ...

Например, в ant-скриптах это не проблема, но в app.config я не могу найти способ. Попробовал это например:

<connectionStrings configSource="WebConnectionString.config">
  <add name="ConnectionString"
    connectionString="..." 
    providerName="System.Data.SqlClient"/>
</connectionStrings>

То, что я пытаюсь сделать, это то, что если существует WebConnectionString.config, то использовать connectionString в этом файле конфигурации. Если это не так, используйте код, определенный в примере кода (например, в app.config).

Ответы [ 6 ]

4 голосов
/ 18 декабря 2009

ВЕБ-ПРОЕКТЫ WOOHOO

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

Тогда вы также можете иметь конфигурационный файл для каждого клиента, который содержит строки подключения. В зависимости от того, какую конфигурацию сборки вы выберете, различные строки подключения будут вставлены в файл web.config. Так что теперь вы можете создать «отдельный» сайт для каждого клиента, это так просто.

Представьте себе папку с именем config и такими файлами, как cust1ConnectionString.cfg, cust2 ... и т. Д.

Теперь вы создаете конфигурации. Вы уже знакомы с Release и Debug, создайте cust1, cust2.

Затем в проекте веб-развертывания есть возможность заменить разделы веб-конфигурации на разделы из другого файла.

Итак, вы переходите к развертыванию cust1 и говорите, что строка подключения находится в файле cust1connectionstrings.cfg. Скажите, где находится cust2 и т.д ....

И теперь не надо больше ссориться, каждый раз, когда вы создаете сайт для клиента, все его настройки вставляются в файл web.config, и вы можете просто передать правильно настроенный сайт. Неважно, что в SVN, потому что у каждого клиента есть свой конфиг. Сладкие

3 голосов
/ 18 декабря 2009

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

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

Только секция AppSettings позволяет вам переопределять значения с помощью элемента file.

О чем стоит подумать: VS2010 имеет функцию, которая позволяет изменять файлы конфигурации в зависимости от цели сборки (live / release / debug / test и т. Д.).

2 голосов
/ 18 декабря 2009

Вы можете сделать следующее, создать класс, в котором вы инкапсулируете получение строки соединения.

как то так

public static class ConnectionStringBuilder
    {
        const string ConnStringDefault = @"defaultConnString";
        static readonly string _connString = string.Empty;
        public static string Build()
        {
            return _connString;
        }

        /// <summary>
        /// Builds connection string from the config file with the given name
        /// </summary>
        /// <param name="name">The name.</param>
        /// <returns></returns>
        public static string Build(string name)
        {
            if (ConfigurationManager.ConnectionStrings[name] != null)
                return ConfigurationManager.ConnectionStrings[name].ConnectionString;

            throw new ArgumentException("Connectionstring with given name '" + name +"' not found! ", "name");
        }

        /// <summary>
        /// Initializes the <see cref="ConnectionStringBuilder"/> class.
        /// </summary>
        static ConnectionStringBuilder()
        {

            if (ConfigurationManager.ConnectionStrings["default"] != null)
            {
                log.Info("conn string in config found");
                _connString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
            }
            else
            {
                log.Info("no default connection string found, using test connection string");
                _connString = ConnStringDefault;
            }
        }
    }

и использование будет примерно таким

using(var conn = new SqlConnection(ConnectionStringBuilder.Build())
   {
      // do some stuff...
   }

надеюсь, что поможет

0 голосов
/ 30 декабря 2009

Я бы переместил строки подключения в machine.config. Таким образом, вам никогда не придется беспокоиться об изменении чего-либо, поскольку все они хранятся / управляются на самом сервере. Теперь вы можете без проблем загружать новые сборки, гарантируя, что все строки подключения останутся такими же, какими они были изначально.

0 голосов
/ 18 декабря 2009

Один из подходов заключается в использовании проекта веб-развертывания для замены раздела connectionStrings в web.config во время сборки. Вы можете иметь режим отладки, который использует ваши connstrs, и режим выпуска, который оставляет их без изменений. Все может быть полностью проверено в SVN. Вы также можете использовать WDP для применения других пользовательских шагов после сборки, что может быть очень удобно.

Другой вариант - полностью переместить их в appSettings, но этот файл содержит только пары имя / значение, поэтому потребуется изменение кода.

0 голосов
/ 18 декабря 2009

Когда мы делаем сборку, мы заменяем конфигурацию SVN производственной конфигурацией, мы также перемещаемся, чтобы сделать строки подключения полностью веб-службой, основанной на всех приложениях, независимо от состояния, указывающего на веб-службу connection string, которая вытягивает правильную внизу.

...