使用企业库 5 流式配置 API 无需替换更新配置
使用企业库 5 流式配置 API 无需替换更新配置
今天我在一篇关于企业库 5 中流式配置 API 的文章中收到一个问题。问题是,如何在运行时向现有配置添加数据库连接字符串。提出问题的人也发布了一个具体的解决方案,我将其重构为一个通用的解决方案,将在本文中展示。
问题
在使用流式配置 API 时,ConfigurationSourceBuilder
类只有一个方法可以更新配置,那就是 UpdateConfigurationWithReplace
。此方法更新配置源,并用构建器构建的那些替换任何现有的部分。如果在运行时,我们想要更新配置而无需替换当前配置,那么就会出现问题。
解决方案
使用 System.Configuration
API 获取当前配置,并将其添加到您构建的新配置中。以下是使用 流式配置 API 的一部分 IDataConfiguration
复制所有当前连接字符串的实现方式
private static void CopyCurrentDataConfiguration(IDataConfiguration dataConfig)
{
// Load the configuration from the configuration file
var configSource = ConfigurationSourceFactory.Create();
// Retrieve the default datasource name
var dataConfigurationSection = (DatabaseSettings)configSource.GetSection(
DatabaseSettings.SectionName);
var defaultDatabaseName = dataConfigurationSection.DefaultDatabase;
CopyConnectionStrings(dataConfig, defaultDatabaseName);
}
private static void CopyConnectionStrings(IDataConfiguration dataConfig,
string defaultDatabaseName)
{
// Add the configurations from our application config file to the builder
foreach (ConnectionStringSettings settings in ConfigurationManager.ConnectionStrings)
{
var configuredDatabase = dataConfig
.ForDatabaseNamed(settings.Name)
.ThatIs
.AnotherDatabaseType(settings.ProviderName);
if (settings.Name.Equals(defaultDatabaseName))
{
configuredDatabase.AsDefault();
}
}
}
在第一个方法中,我检索企业库数据库设置并保存默认数据库名称。然后我使用第二个方法配置所有当前的连接字符串。由于不知道数据库提供程序,我使用 AnotherDatabaseType
方法添加提供程序。以下是如何使用这些方法将另一个连接字符串添加到您的配置的示例
public void AddNewConnectionString(string databaseName, string connString)
{
var builder = new ConfigurationSourceBuilder();
var dataConfig = builder.ConfigureData();
CopyCurrentDataConfiguration(dataConfig);
// Add our database connections to the builder
dataConfig
.ForDatabaseNamed(databaseName)
.ThatIs
.ASqlDatabase()
.WithConnectionString(connString);
// Create a new configuration source, update it with the builder and make it the
// current configuration
var newConfigSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace(newConfigSource);
EnterpriseLibraryContainer.Current =
EnterpriseLibraryContainer.CreateDefaultContainer(newConfigSource);
}
摘要
流式配置 API 中目前不支持仅更新配置而不替换配置,这可能会给您带来麻烦,当您需要这种行为时。在本文中,我展示了一种配置 EnterpriseLibraryContainer
而无需替换当前连接字符串配置的解决方法。此方法也可以应用于其他配置,但您需要编写代码来实现它。