我正在使用 .NET 中新的
HostApplicationBuilder
。我想使用 IOptionsMonitor
来监视 appsettings.json
的一部分的选项更改,并将这些更改应用到 Serilog LoggingLevelSwitch.MinimumLevel
,以获取在主机构建期间创建的此类对象(使用 builder.Services.AddSerilog
)。
类似这样的:
builder.Services.Configure<LoggingOptions>(
builder.Configuration.GetSection(key: "Logging"));
LoggingLevelSwitch theSwitch = new LoggingLevelSwitch(); // Later added to a Serilog sink.
builder.Services.AddSingleton<Something>((serviceProvider) =>
{
var monitor = serviceProvider.GetRequiredService<IOptionsMonitor<LoggingOptions>>();
monitor.OnChange((options) => {
theSwitch.MinimumLevel = options.MinimumLevel;
});
}
但是我从
AddSingleton
调用中返回什么?我真的不想添加服务,只是将 OnChange
处理程序添加到 IOptionsMonitor<LoggingOptions>
的单例中。
如果没有像
builder.Services.AddXXX
这样的调用,我如何获得一个 IServiceProvider
实例来获取对 IOptionsMonitor<LoggingOptions>
单例的引用?
这应该是一个实用程序包中的帮助程序,我们可以在多个不同的应用程序中使用它来简化和统一应用程序代码并减少应用程序中的样板代码,以允许基于 .NET 托管的应用程序设置日志记录并允许日志记录在运行时修改级别。
当应用程序工作线程启动时将
IOptionsMonitor
连接到 LoggingLevelSwitch
并在应用程序工作线程终止时将其删除就足够了。但我想避免要求应用程序作者记住在工作人员的启动/停止代码中进行额外的调用。因此,最好能够在设置一般日志记录的实用程序包的代码中进行设置。
使用 Singleton 无法实现这一点,添加 Singleton 将仅在启动时调用一次来获取该实例。这里最好的机会是范围,所以你需要每个请求或瞬态的新实例。