在.NET 8 Azure Function中,如何在ConfigureServices访问配置?
在.NET 8 Azure Function的ConfigureServices中直接通过配置键访问配置
要在ConfigureServices中直接通过配置键(如ConnectionStrings:MyConnectionString)获取配置,无需定义配置类或使用Options模式,你可以通过以下两种方式实现:
方式一:利用HostBuilder配置上下文(推荐)
修改ConfigureServices的委托,接收HostBuilderContext参数,该上下文已包含你在ConfigureAppConfiguration中构建的配置实例:
var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureAppConfiguration(builder => { var environment = Environment.GetEnvironmentVariable("ENVIRONMENT") ?? "development"; builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); }) .ConfigureServices((context, services) => { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); // 直接从上下文获取配置 var connectionString = context.Configuration["ConnectionStrings:MyConnectionString"]; services.AddDbContext<AssetOwnershipContext>(options => { options.UseSqlServer(connectionString); }); services.AddScoped<IApplicationService, ApplicationService>(); services.AddSingleton<GraphServiceClient>(sp => new GraphServiceClient( new DefaultAzureCredential(new DefaultAzureCredentialOptions() { ExcludeSharedTokenCacheCredential = true }) ) ); }) .Build(); host.Run();
方式二:从服务容器解析IConfiguration
如果不想依赖HostBuilderContext,可以临时构建服务提供者并解析IConfiguration实例:
var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureAppConfiguration(builder => { var environment = Environment.GetEnvironmentVariable("ENVIRONMENT") ?? "development"; builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); }) .ConfigureServices(services => { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); // 从服务容器解析配置 var config = services.BuildServiceProvider().GetRequiredService<IConfiguration>(); var connectionString = config["ConnectionStrings:MyConnectionString"]; services.AddDbContext<AssetOwnershipContext>(options => { options.UseSqlServer(connectionString); }); services.AddScoped<IApplicationService, ApplicationService>(); services.AddSingleton<GraphServiceClient>(sp => new GraphServiceClient( new DefaultAzureCredential(new DefaultAzureCredentialOptions() { ExcludeSharedTokenCacheCredential = true }) ) ); }) .Build(); host.Run();
注意事项
- 方式一更推荐,因为不需要额外构建服务提供者,性能更优且符合依赖注入的设计原则。
- 确保
appsettings.json或对应环境的配置文件中存在ConnectionStrings:MyConnectionString键值对,或者已通过环境变量配置该值。
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

