using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TinaX.Systems.Configuration { /// /// Base helper class for implementing an /// public abstract class ConfigurationProvider : IConfigurationProvider { protected ConfigurationProvider() { Data = new Dictionary(StringComparer.OrdinalIgnoreCase); } protected IDictionary Data { get; set; } /// /// Attempts to find a value with the given key, returns true if one is found, false otherwise. /// /// /// /// public virtual bool TryGet(string key, out string value) => this.Data.TryGetValue(key, out value); public virtual void Set(string key, string value) => this.Data[key] = value; public virtual void Load() { } public IEnumerable GetChildKeys(IEnumerable earlierKeys, string parentPath) { var prefix = parentPath == null ? string.Empty : parentPath + ConfigurationPath.KeyDelimiter; return Data .Where(kv => kv.Key.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) .Select(kv => Segment(kv.Key, prefix.Length)) .Concat(earlierKeys) .OrderBy(k => k, ConfigurationKeyComparer.Instance); } private static string Segment(string key, int prefixLength) { var indexOf = key.IndexOf(ConfigurationPath.KeyDelimiter, prefixLength, StringComparison.OrdinalIgnoreCase); return indexOf < 0 ? key.Substring(prefixLength) : key.Substring(prefixLength, indexOf - prefixLength); } /// /// Triggers the reload change token and creates a new one. /// protected void OnReload() { } /// /// Generates a string representing this provider name and relevant details. /// /// The configuration name. public override string ToString() => $"{GetType().Name}"; } }