我使用内存数据库作为配置提供程序。我添加了带有 id、key 和 value 列的表,并在 ConfigurationProvider 的 Load 函数中为它们分配了值。
public override void Load()
{
this.Data = new Dictionary<string, string?>()
{
{"Logging__Console__LogLevel__Default","Trace"}
};
using (var db = new ConfigurationDbContext(this._connectionString))
{
db.Database.EnsureCreated();
if (!db.RevisionOption.Any())
{
foreach (var data in Data)
{
db.RevisionOption.Add(new RevisionConfigurationOption()
{
Key = data.Key,
Value = data.Value ?? "None"
});
}
db.SaveChanges();
}
foreach (var data in db.RevisionOption)
{
this.Data.Clear();
this.Data.Add(data.Key, data.Value);
}
}
}
我已经在 IConfigurationSource 中添加了提供者
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new RevisionProvider(this._connectionString);
}
在扩展方法中,我已将 Source 添加到 IConfiburationBuilder
public static IConfigurationBuilder AddCustomConfiguration(this IConfigurationBuilder builder)
{
var currentConfiguration = builder.Build();
var connectionString = currentConfiguration.GetConnectionString("configurationConnectionString");
builder.Add(new RevisionSource(connectionString));
return builder;
}
在 Program.cs 中我调用了这样的方法
var configuration = new ConfigurationBuilder()
//.AddEnvironmentVariables()
.AddJsonFile($"appsettings{(string.IsNullOrWhiteSpace(environmentName) ? string.Empty : "." + environmentName)}.json")
.AddCustomConfiguration()
.Build();
接下来我创建了一个 ServiceCollection 对象并尝试添加控制台记录器
var serviceProvider = new ServiceCollection()
.AddLogging(loggingBuilder =>
{
loggingBuilder.ClearProviders()
.AddConfiguration(configuration.GetSection("Logging"))
.AddConsole();
})
.BuildServiceProvider();
var logger = serviceProvider.GetRequiredService<ILogger<Program>>();
logger.LogDebug("hello");
问题是,如果我将键值对添加为环境变量 {"Logging__Console__LogLevel__Default","Trace"}
然后就可以了。日志写入终端。但是使用自定义 ConfigurationProvider 它不会。