Thanks Markus, I create my own configuration provider as described here.
Configuration provider where I serialize settings data (AuthenticationScheme, ValidIssuer and some other properties....)
public class CarrierConfigurationProvider : ConfigurationProvider
{
private readonly string _connectionString;
public CarrierConfigurationProvider(string connectionString) =>
_connectionString = connectionString;
public override void Load()
{
var options = new DbContextOptionsBuilder<CarrierContext>()
.UseSqlServer(_connectionString).Options;
using var dbContext = new CarrierContext(options);
var lstSettings = dbContext.Settings.ToList();
Data = lstSettings.ToDictionary(c => $"SettingsCarrier:{c.Id}" , c => JsonConvert.SerializeObject(c));
}
}
Configuration Source :
public class CarrierConfigurationSource : IConfigurationSource
{
private readonly string _connectionString;
public CarrierConfigurationSource(string connectionString) =>
_connectionString = connectionString;
public Microsoft.Extensions.Configuration.IConfigurationProvider Build(IConfigurationBuilder builder) =>
new CarrierConfigurationProvider(_connectionString);
}
Configuration builder extension :
public static class ConfigurationBuilderExtensions
{
public static IConfigurationBuilder AddCarrierConfiguration(
this IConfigurationBuilder builder)
{
var tempConfig = builder.Build();
var connectionString =
tempConfig.GetConnectionString("CarrierSettingConnection");
return builder.Add(new CarrierConfigurationSource(connectionString));
}
}
Next I use my custom configuration in Program.cs :
builder.Configuration.AddCarrierConfiguration();
var settings = builder.Configuration.GetCarrierSetting();
And GetCarrierSetting method who return a list of Setting:
public static List<Setting> GetCarrierSetting(this IConfiguration configuration)
{
var result = configuration.AsEnumerable().Where(w => w.Key.StartsWith("SettingsCarrier:")).Select(s => s.Value);
List<Setting> lstSetting = new();
foreach(var item in result)
{
lstSetting.Add(JsonConvert.DeserializeObject<Setting>(item));
}
return lstSetting;
}
So like this, I think it's good practice to load data in ConfigureServices method without call BuildServiceProvider.