可以看到configurationRoot 既可以把section1:key3 当作key,同时也可以把section1:key3,当作以section1为分组下面的key3。
这里我们就走进configurationRoot,看下它是如何让我们通过索引的方式获取值的。
configurationRoot 下的索引:
这个其实就是遍历我们的providers。那么来看下getsection部分。
public IConfigurationSection GetSection(string key) => new ConfigurationSection(this, key);查看ConfigurationSection的主要部分:
public ConfigurationSection(IConfigurationRoot root, string path) { if (root == null) { throw new ArgumentNullException(nameof(root)); } if (path == null) { throw new ArgumentNullException(nameof(path)); } _root = root; _path = path; } public string this[string key] { get { return _root[ConfigurationPath.Combine(Path, key)]; } set { _root[ConfigurationPath.Combine(Path, key)] = value; } }实例化主要是记录section的值,并且记录IConfigurationRoot来源。
然后其索引方式还是调用了IConfigurationRoot,只是setion的值和key值做了一些处理,这个处理是ConfigurationPath来完成的。
看下ConfigurationPath:
/// <summary> /// The delimiter ":" used to separate individual keys in a path. /// </summary> public static readonly string KeyDelimiter = ":"; /// <summary> /// Combines path segments into one path. /// </summary> /// <param>The path segments to combine.</param> /// <returns>The combined path.</returns> public static string Combine(params string[] pathSegments) { if (pathSegments == null) { throw new ArgumentNullException(nameof(pathSegments)); } return string.Join(KeyDelimiter, pathSegments); }从上诉看,ConfigurationSection的原理还是很简单的。
getSetion 部分把前缀记录下来,然后和key值做一个拼接,还是调用ConfigurationRoot的索引部分。
经过简单的分析,我们完全可以玩套娃模式。
static void Main(string[] args) { IConfigurationBuilder builder = new ConfigurationBuilder(); builder.AddInMemoryCollection(new Dictionary<string,string>() { {"key1","value1"}, {"key2","value2"}, {"section1:key3","values3"}, {"section2:section3:key4","values4"} }); IConfigurationRoot configurationRoot = builder.Build(); var section2 = configurationRoot.GetSection("section2"); var section3 = section2.GetSection("section3"); Console.WriteLine(section3["key4"]); }虽然不提倡,但是可以这么干。
结下一节,配置文件之军令(命令行)
以上只是个人整理,如有错误,望请指出,谢谢。