using System; using System.Collections; using System.Collections.Generic; using System.Configuration; using System.Linq; using Microsoft.Extensions.Configuration; namespace ASC.Common.Utils { public class ConnectionStringCollection : IEnumerable { private List Data { get; set; } public ConnectionStringCollection(IEnumerable data) => Data = data.ToList(); public IEnumerator GetEnumerator() { return Data.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public ConnectionStringSettings this[string name] { get { return Data.FirstOrDefault(r => r.Name == name); } } } [Singletone] public class ConfigurationExtension { private IConfiguration Configuration { get; } private Lazy ConnectionStringSettings { get; } public ConfigurationExtension(IConfiguration configuration) { Configuration = configuration; ConnectionStringSettings = new Lazy(new ConnectionStringCollection(GetSettings("ConnectionStrings"))); } public IEnumerable GetSettings(string section) where T : new() { var result = new List(); var sectionSettings = Configuration.GetSection(section); foreach (var ch in sectionSettings.GetChildren()) { var cs = new T(); ch.Bind(cs); result.Add(cs); } return result; } public T GetSetting(string section) where T : new() { return GetSetting(section, new T()); } public T GetSetting(string section, T instance) { var sectionSettings = Configuration.GetSection(section); sectionSettings.Bind(instance); return instance; } public ConnectionStringCollection GetConnectionStrings() { return ConnectionStringSettings.Value; } public ConnectionStringSettings GetConnectionStrings(string key) { return GetConnectionStrings()[key]; } public string this[string key] { get => Configuration[key]; set => Configuration[key] = value; } } }