导航

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"]);
        }