using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Kean.Presentation.Rest
{
///
/// 配置文件的取值方式
///
public class ConfigurationProvider : IConfigurationProvider
{
private readonly IConfiguration _configuration;
///
/// 初始化 Kean.Presentation.Rest.ConfigurationProvider 类的新实例
///
public ConfigurationProvider(IConfiguration configuration)
{
_configuration = configuration;
}
/*
* 实现 Microsoft.Extensions.Configuration.GetChildKeys 方法
*/
public IEnumerable GetChildKeys(IEnumerable earlierKeys, string parentPath) =>
(parentPath == null ? _configuration : _configuration.GetSection(parentPath))
.GetChildren()
.Select(c => c.Key)
.Concat(earlierKeys)
.OrderBy(k => k, ConfigurationKeyComparer.Instance);
/*
* 实现 Microsoft.Extensions.Configuration.GetReloadToken 方法
*/
public IChangeToken GetReloadToken() =>
_configuration.GetReloadToken();
/*
* 实现 Microsoft.Extensions.Configuration.Set 方法
*/
public void Set(string key, string value) =>
_configuration[key] = value;
/*
* 实现 Microsoft.Extensions.Configuration.Load 方法
*/
public void Load() { }
/*
* 实现 Microsoft.Extensions.Configuration.TryGet 方法
*/
public bool TryGet(string key, out string value) =>
(value = Interpolate(key)) != null;
/*
* 插值递归
*/
private string Interpolate(string key)
{
var value = _configuration[key];
if (value != null)
{
foreach (var item in new Regex(@"(?<=\$\{)[^\$\{\}]*(?=\})", RegexOptions.Compiled).Matches(value).Cast().SelectMany(m => m.Captures.Cast()))
{
value = value.Replace($"${{{item.Value}}}", Interpolate(item.Value));
}
}
return value;
}
}
}