using Core.Configurations.JsonConfigProvider; using Core.Configurations.SmartConfigProvider; using Core.Exceptions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Core.Configurations.SmartConfig { public static class SmartConfigExtension { public static IConfigurationBuilder AddSmartConfig(this IConfigurationBuilder builder, string configKey = "DefaultConnection", string path = null) { return builder.AddProvider(new SmartConfigProvider(builder, configKey, path)); } } public class SmartConfigProvider : IConfigurationProvider { string _configKey; string _connectionString; string _path; IConfigurationBuilder _builder; Newtonsoft.Json.Linq.JObject _configuration; public SmartConfigProvider() { } public SmartConfigProvider(IConfigurationBuilder builder, string configKey, string configurationFilePath) { _builder = builder; _configKey = configKey; _path = configurationFilePath; SetConnectionString(); } void SetConnectionString() { var carrier = _builder.ConfigurationProviders.OfType().SingleOrDefault(); if (carrier?.ConfigurationFilePath is null && _path is null) throw new ConfigurationException($"Expected a previous added ConfigurationProvider with IHasConfigurationFilePath or a configurationFilePath where to find the appsettingsfile"); _path ??= carrier.ConfigurationFilePath; if (!File.Exists(_path)) throw new ConfigurationException($"File not found, configurationFilePath: {_path}"); using (StreamReader file = File.OpenText(_path)) using (JsonTextReader reader = new JsonTextReader(file)) { var jsonConfiguration = (Newtonsoft.Json.Linq.JObject)Newtonsoft.Json.Linq.JToken.ReadFrom(reader); _connectionString = jsonConfiguration.SelectToken($"ConnectionStrings.{_configKey}")?.ToString(); } } public void Build() { var repository = new ConfigurationRepository(_connectionString); var configs = repository.GetActiveConfigurations(); var pairs = configs.Select(x => new KeyValuePair(x.Key, JToken.Parse(x.Value.ToString()))); _configuration = Common.KeyValueToJson.Convert(pairs); } public Newtonsoft.Json.Linq.JObject Configuration() { return _configuration; } } }