重新整理 .net core 实践篇————配置系统之盟约[五] (3)

重新整理 .net core 实践篇————配置系统之盟约[五]

可以看到configurationRoot 既可以把section1:key3 当作key,同时也可以把section1:key3,当作以section1为分组下面的key3。

这里我们就走进configurationRoot,看下它是如何让我们通过索引的方式获取值的。
configurationRoot 下的索引:

public string this[string key] { get { for (int i = _providers.Count - 1; i >= 0; i--) { IConfigurationProvider provider = _providers[i]; if (provider.TryGet(key, out string value)) { return value; } } return null; } set { if (!_providers.Any()) { throw new InvalidOperationException(SR.Error_NoSources); } foreach (IConfigurationProvider provider in _providers) { provider.Set(key, value); } } }

这个其实就是遍历我们的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"]); }

重新整理 .net core 实践篇————配置系统之盟约[五]

虽然不提倡,但是可以这么干。

下一节,配置文件之军令(命令行)

以上只是个人整理,如有错误,望请指出,谢谢。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjgdf.html