2013-07-29 4 views
2

Мы разрабатываем проект на разных машинах. Каждая из этих машин имеет свои собственные подключения к базе данных.Автоматическая загрузка конфигурации по имени хоста в C#

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

<connectionStrings configSource="DB.config" /> 

Теперь я хочу, чтобы иметь возможность сохранять различные файлы, такие как DB.BobsPC.config и DB.JacksPC.config где BobsPC и JacksPC имя хоста машины код отлаживается. Эта конфигурация правильного хоста должна использоваться автоматически.

Что-то вроде:

<connectionStrings configSource="DB.[hostname].config" /> 

Есть умный способ сделать это?

+0

Вы могли бы попробовать, включая переменные окружения в' configSource', на авось что он автоматически расширяет их: '' – Cocowalla

ответ

4

Вы можете использовать "XML-Document-Transform Syntax" Обычно этот синтаксис IST предназначен для использования в сети проектов, но вы можете настроить его для использования во всех проектах.

Вы должны изменить файл проекта (например. .csproj), добавив/обновив TransformXml-Task. В приведенном ниже примере преобразование выполняется во время компиляции путем применения преобразования в App.config. Как вы можете видеть, задача относится к переменной $ (Конфигурация), поэтому команды преобразования хранятся, например. в App.DEBUG.config или App.RELEASE.config. Вы можете изменить это на любую переменную msbuild, которая вам нравится. Если я правильно помню, это было $ (COMPUTERNAME), поэтому вам нужно разместить свое преобразование в App.MyMachineName.config.

<UsingTask TaskName="TransformXml" 
      AssemblyFile="C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 
<Target Name="AfterBuild"> 
    <!-- use App.$(COMPUTERNAME).config for specific machine configuration --> 
    <TransformXml Source="App.config" 
       Condition="Exists('App.$(Configuration).config')" 
       Transform="App.$(Configuration).config" 
       Destination="$(OutDir)$(AssemblyName).dll.config"/> 
</Target> 

Полное описание доступно на german blog.

`s, что вы машина специфическая конфигурация выглядит следующим образом:

<?xml version="1.0"?> 
<!-- "App.MyMachineName.config" - File name corresponds to the transformation task --> 
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
    <connectionStrings> 
    <add name="MyDbConnection" 
     connectionString="Data Source=MyServer;Initial Catalog=MyDb;" 
     providerName="System.Data.SqlClient" 
     xdt:Transform="SetAttributes" 
     xdt:Locator="Match(name)"/> 
    </connectionStrings> 
</configuration> 

В качестве альтернативы, вы можете использовать XSL Syntax

1

Вы можете добавить его в machine.config на каждой отдельной машине, а не в .config.

+0

У меня разные .configs для каждой машины. Я спрашивал об автоматическом сборе «правильной» конфигурации –

3
public static string GetConnString() 
{ 
    string connString = ConfigurationSettings.AppSettings[GetConfigKey("database")]; 
    return connString; 
} 

public static string GetConfigKey(string baseKey) 
{ 
    string str = baseKey; 
    if (GetHostName().StartsWith("BobsPC")) 
    { 
     // set str = the appropriate string = DB.[hostname].config 
    } 
    else if (GetHostName().StartsWith("JacksPC")) 
    { 
     // set str = the appropriate string = DB.[hostname].config 
    } 
    return str; 

}

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

+0

Хотя этот ответ требует более гибкого кода, я думаю, что этот подход более приятный, поэтому вам не нужно повторно компилировать или повторно запускать msbuild для каждой машины. – user2415376

Смежные вопросы