与在 ASP.NET 中如何拥有多个 Web.config 类似,是否可以根据构建配置拥有多个 App.config?
我想更改我的连接字符串,所以如果我正在构建配置test
,连接字符串应该是:
"Server=test;Initial Catalog=test..."
如果我正在构建test2
,则连接字符串将是:
"Server=anotherserver; Initial Catalog=test2..."
目前,我正在手动操作,所以我想知道如何实现自动化?
与在 ASP.NET 中如何拥有多个 Web.config 类似,是否可以根据构建配置拥有多个 App.config?
我想更改我的连接字符串,所以如果我正在构建配置test
,连接字符串应该是:
"Server=test;Initial Catalog=test..."
如果我正在构建test2
,则连接字符串将是:
"Server=anotherserver; Initial Catalog=test2..."
目前,我正在手动操作,所以我想知道如何实现自动化?
尽管它们不是本机支持的,但您也可以对 Windows 窗体项目 (App.config) 进行 XML 转换,而不仅仅是 Web 应用程序项目。
有一个支持该支持的 VS 插件,虽然我从未尝试过,但对于安装了 VS 的环境,我会推荐它,因为它由至少一名我确信对 MSBuild 有深入了解的 Microsoft 员工编写,因为他已经写了一本关于这个主题的书。
我不知道 SlowCheetah 是否为未安装 VS 的 CI 服务器提供支持,因此我还将基于包含自定义目标文件提出另一种解决方案。
Visual Studio App.config XML 转换
(无耻的外挂通知,我是上面那个的原作者)
我们在这里使用了一种似乎效果很好的策略。每个解决方案都有一个 Web.config。我认为这也适用于 app.configs,但从未尝试过。您创建一个类,将其称为例如 ConfigurationManager。在课堂上应该去这个代码:
public static class ConfigurationManager
{
private static NameValueCollection _appSettings = new NameValueCollection();
private static ConnectionStringSettingsCollection _connSettings = new ConnectionStringSettingsCollection();
private enum SettingsType {App, Connection};
public static NameValueCollection AppSettings
{
get
{
if (_appSettings.Count == 0)
{
LoadEnvironmentSettings(SettingsType.App);
}
return _appSettings;
}
}
public static ConnectionStringSettingsCollection ConnectionStrings
{
get
{
if (_connSettings.Count == 0)
{
LoadEnvironmentSettings(SettingsType.Connection);
}
return _connSettings;
}
}
private static void LoadEnvironmentSettings(SettingsType settingsType)
{
string strEnvironment = string.Empty, strSeparator = ".";
if (ConfigurationManager.AppSettings.HasKeys())
{
strEnvironment = ConfigurationManager.AppSettings["Environment"];
if (!String.IsNullOrEmpty(strEnvironment))
{
strEnvironment += strSeparator;
switch (settingsType)
{
case SettingsType.App:
LoadAppSettings(strEnvironment.ToUpper());
break;
case SettingsType.Connection:
LoadConnectionSettings(strEnvironment.ToUpper());
break;
}
}
else //that part should never happen
{
throw new Exception("Missing Environment AppSetting");
}
}
}
private static void LoadAppSettings(string environmentType)
{
string appKey = string.Empty;
foreach (string key in ConfigurationManager.AppSettings.AllKeys)
{
if (key.StartsWith(environmentType))
{
appKey = key.Replace(environmentType, string.Empty);
_appSettings.Add(appKey, ConfigurationManager.AppSettings[key]);
}
}
}
private static void LoadConnectionSettings(string environmentType)
{
//ConnectionStringSettings connStrings = new ConnectionStringSettings();
string connKey = string.Empty;
foreach (ConnectionStringSettings str in ConfigurationManager.ConnectionStrings)
{
if (str.Name.StartsWith(environmentType))
{
connKey = str.Name.Replace(environmentType, string.Empty);
_connSettings.Add(new ConnectionStringSettings(connKey, str.ConnectionString));
}
}
}
}
您需要添加 System、System.Collections.Generic、System.Collections.Specialized、System.Configuration 和 System.Text。确保你的类与你正在处理的项目在同一个命名空间中。然后,在您的配置文件中添加两个(或更多)键,例如,
<add name="TEST.MyConnectionString" connectionString="Data Source=TESTServer;Initial Catalog=MyDatabase;user id=MyUser;pwd=Mypwd" />
<add name="TEST2.MyConnectionString" connectionString="Data Source=TEST2Server;Initial Catalog=MyDatabase;user id=MyUser;pwd=Mypwd" />
最后,在您的 machine.config 中,在 appSettings 中添加以下内容:
<add key="Environment" value="TEST"/>
或者
<add key="Environment" value="TEST2"/>
取决于你想做什么。我们通常放置 DEV、STAGING 和 PROD 密钥,然后在我们的三个不同的 DEV、STAGING 和 PROD 服务器上拥有不同的 machine.config 文件。希望这可以帮助