04-003 Configuration 之 EnvironmentVariablesConfigurationSource
Posted on 2015-03-16 15:34 DotNet1010 阅读(219) 评论(0) 收藏 举报核心代码是Load:
internal void Load(IDictionary envVariables)
{
ReplaceData(envVariables
.Cast<DictionaryEntry>()
.SelectMany(AzureEnvToAppEnv)
.Where(entry => ((string)entry.Key).StartsWith(_prefix, StringComparison.OrdinalIgnoreCase))
.ToDictionary(
entry => ((string)entry.Key).Substring(_prefix.Length),
entry => (string)entry.Value,
StringComparer.OrdinalIgnoreCase));
}
private static IEnumerable<DictionaryEntry> AzureEnvToAppEnv(DictionaryEntry entry)
{
var key = (string)entry.Key;
var prefix = string.Empty;
var provider = string.Empty;
if (key.StartsWith(MySqlServerPrefix, StringComparison.OrdinalIgnoreCase))
{
prefix = MySqlServerPrefix;
provider = "MySql.Data.MySqlClient";
}
else if (key.StartsWith(SqlAzureServerPrefix, StringComparison.OrdinalIgnoreCase))
{
prefix = SqlAzureServerPrefix;
provider = "System.Data.SqlClient";
}
else if (key.StartsWith(SqlServerPrefix, StringComparison.OrdinalIgnoreCase))
{
prefix = SqlServerPrefix;
provider = "System.Data.SqlClient";
}
else if (key.StartsWith(CustomPrefix, StringComparison.OrdinalIgnoreCase))
{
prefix = CustomPrefix;
}
else
{
yield return entry;
yield break;
}
// Return the key-value pair for connection string
yield return new DictionaryEntry(
string.Format(ConnStrKeyFormat, key.Substring(prefix.Length)),
entry.Value);
if (!string.IsNullOrEmpty(provider))
{
// Return the key-value pair for provider name
yield return new DictionaryEntry(
string.Format(ProviderKeyFormat, key.Substring(prefix.Length)),
provider);
}
}
测试一下: 每一个会变成两条记录:如下的 11 和 12. 本来是53条记录 多了两条 变成55条记录。
单元测试的示例:
public void LoadKeyValuePairsFromAzureEnvironment()
{
var dict = new Hashtable()
{
{"APPSETTING_AppName", "TestAppName"},
{"CUSTOMCONNSTR_db1", "CustomConnStr"},
{"SQLCONNSTR_db2", "SQLConnStr"},
{"MYSQLCONNSTR_db3", "MySQLConnStr"},
{"SQLAZURECONNSTR_db4", "SQLAzureConnStr"},
{"CommonEnv", "CommonEnvValue"},
};
var envConfigSrc = new EnvironmentVariablesConfigurationSource();
envConfigSrc.Load(dict);
Assert.Equal(9, envConfigSrc.Data.Count);
Assert.Equal("TestAppName", envConfigSrc.Data["APPSETTING_AppName"]);
Assert.False(envConfigSrc.Data.ContainsKey("AppName"));
Assert.Equal("CustomConnStr", envConfigSrc.Data["Data:db1:ConnectionString"]);
Assert.Equal("SQLConnStr", envConfigSrc.Data["Data:db2:ConnectionString"]);
Assert.Equal("System.Data.SqlClient", envConfigSrc.Data["Data:db2:ProviderName"]);
Assert.Equal("MySQLConnStr", envConfigSrc.Data["Data:db3:ConnectionString"]);
Assert.Equal("MySql.Data.MySqlClient", envConfigSrc.Data["Data:db3:ProviderName"]);
Assert.Equal("SQLAzureConnStr", envConfigSrc.Data["Data:db4:ConnectionString"]);
Assert.Equal("System.Data.SqlClient", envConfigSrc.Data["Data:db4:ProviderName"]);
Assert.Equal("CommonEnvValue", envConfigSrc.Data["CommonEnv"]);
}
浙公网安备 33010602011771号