using System; using System.Collections.Generic; using System.Linq; namespace TinaX.Systems.Configuration.Internal { /// /// TinaX.Core 内置配置服务 /// public class ConfigurationRoot : IConfigurationRoot , IDisposable { public string this[string key] { get { return this.GetString(key, null); } set { if (!m_ConfigurationProviders.Any()) { throw new InvalidOperationException("No Configuration Provider"); } foreach(var provider in m_ConfigurationProviders) { provider.Set(key, value); } } } private IList m_ConfigurationProviders; public IEnumerable Providers => m_ConfigurationProviders; public ConfigurationRoot(IList providers) { if (providers == null) throw new ArgumentNullException(nameof(providers)); m_ConfigurationProviders = providers; foreach(var p in m_ConfigurationProviders) { p.Load(); } } /// /// 添加配置提供者 /// /// /// internal IConfiguration AddConfigurationProvider(IConfigurationProvider provider) { if (!m_ConfigurationProviders.Contains(provider)) m_ConfigurationProviders.Add(provider); return this; } internal string GetString(string key, string defaultValue = null) { int len = m_ConfigurationProviders.Count; if (len < 1) return defaultValue; for (int i = m_ConfigurationProviders.Count - 1; i >= 0; i--) { if (m_ConfigurationProviders[i].TryGet(key, out string _v)) { return _v; } } return defaultValue; } public IEnumerable GetChildren() => this.GetChildrenImplementation(null); public IConfigurationSection GetSection(string key) => new ConfigurationSection(this, key); public void Dispose() { foreach(var provider in m_ConfigurationProviders) { (provider as IDisposable)?.Dispose(); } } } }