按c#中的主机名自动加载配置
本文关键字:加载 配置 主机 | 更新日期: 2023-09-27 18:25:18
我们在不同的机器上开发一个项目。每台机器都有自己的数据库连接。
目前,我们使用外部文件从app.config
中加载数据库配置
<connectionStrings configSource="DB.config" />
现在,我希望能够保存不同的文件,如DB.BobsPC.config
和DB.JacksPC.config
,其中BobsPC
和JacksPC
是调试代码的机器的主机名。应该自动使用正确主机的此配置。
类似于:
<connectionStrings configSource="DB.[hostname].config" />
有聪明的方法吗?
您可以使用"XML文档转换语法"通常,此语法适用于web项目,但您可以调整它以用于所有类型的项目。
您必须通过添加/更新TransformXml任务来修改项目文件(例如.csproj)。在下面的示例中,转换是在调试期间通过在App.config上应用转换来执行的。如您所见,该任务引用$(Configuration)变量,因此转换命令存储在例如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>
完整的描述可以在德语博客上找到。
这就是您机器特定配置的样子:
<?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语法
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;
}
保留一个配置文件,并在运行时使用该逻辑来检测要使用的哪个子集
您可以将其添加到每台机器上的machine.config中,而不是.config.