我的最小 Web api 使用 Azure 应用程序配置来存储多个配置设置。
现在我需要从该配置中获取一些值 before .Build() Web 应用程序,除了使用 BuildServiceProvider 之外,我找不到其他方法来获取我的设置。
var builder = WebApplication.CreateBuilder(args);
const string JSON = "json";
var appSettingsKey = CONSTANTS.APP.SETTINGS.APPSETTINGS.ToLower();
builder.Configuration.AddJsonFile($"{appSettingsKey}.{JSON}", optional: true, reloadOnChange: true);
builder.Configuration.AddJsonFile($"{appSettingsKey}.{builder.Environment.EnvironmentName}.{JSON}", optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Services.Configure<Settings>(builder.Configuration.GetSection(CONSTANTS.APP.SETTINGS.EQUINOX_SETTINGS_PREFIX));
builder.Configuration.AddAzureAppConfiguration(options => options.Connect(builder.Configuration.GetConnectionString(CONSTANTS.APP.SETTINGS.APP_CONFIGURATION_CONNECTION_STRING))
.Select(CONSTANTS.APP.SETTINGS.EQUINOX_SETTINGS_KEY_FILTER, CONSTANTS.APP.SETTINGS.EQUINOX_SETTINGS_LABEL_FILTER)
.ConfigureRefresh(refresh => refresh.Register($"{CONSTANTS.APP.SETTINGS.EQUINOX_SETTINGS_PREFIX}:{CONSTANTS.APP.SETTINGS.SENTINEL_KEY}", refreshAll: true))
.UseFeatureFlags());
var buildServiceProvider = builder.Services.BuildServiceProvider();
var settings = (buildServiceProvider.GetRequiredService<IOptions<Settings>>() ?? null) ?? throw new InvalidOperationException();
builder.Host.UseSerilog((hostBuilderContext, services, configuration) =>
{
configuration.ConfigureLogging(CONSTANTS.CLUSTER.EQUINOX.ToUpper());
configuration.AddApplicationInsightsLogging(services, hostBuilderContext.Configuration, settings.Value);
});
builder.UseOrleans(settings);
builder.AddServices(settings);
var app = builder.Build();
现在我知道从应用程序代码结果中调用“BuildServiceProvider” 在单例服务的附加副本中,但由于我需要注册一些需要这些设置的服务,例如 Serilog 的 ApplicationInsights,我不知道该怎么做。
正确的做法是什么?
ConfigurationBinder.Get
扩展方法,无需构建服务提供者。沿着这些思路:
var section = builder.Configuration.GetSection(CONSTANTS.APP.SETTINGS.EQUINOX_SETTINGS_PREFIX);
var settings = section.Get<Settings>();
// use settings