提问人:GoldieLocks 提问时间:11/15/2023 更新时间:11/15/2023 访问量:29
为什么在 Azure Functions 依赖项注入中使用 IConfiguration 是一件坏事
Why is the use of IConfiguration a bad thing in Azure Functions Dependency Injection
答:
0赞
SiddheshDesai
11/21/2023
#1
IConfiguration 仅用于在代码中从函数应用中检索配置设置。请参阅下文:-
如果将 IConfiguration 用作依赖项注入,并希望在运行时中提取设置,或者在 Azure 函数应用中错误地配置了设置,则 IConfiguration 可能会显示意外行为。因此,根据文档,使用函数中设置的自定义设置会有所帮助,同时使用 IConfiguration 将使行为更有效率。
注入
IConfiguration
可能会导致意外行为。若要了解有关添加配置源的详细信息,请参阅自定义配置源。
在“自定义配置源”链接中,使用 IConfiguration 方法
使用自定义 appsettings.json
文件(而不是 Azure 函数的配置设置)替代应用设置时。可能会发生一些意外行为。此外,如果应用程序依赖于最新的配置设置,并且注入的 IConfiguration 设置不同,则在运行应用程序时会发生一些问题。
我尝试使用Http_Trigger函数中的 IConfiguration 方法从我的函数应用中检索设置:-
我在环境变量中的设置:-
MySetting:This is a setting value
我的函数.cs:-
using System;
using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace
{
public class Startup : FunctionsStartup
{
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
IConfigurationRoot config = builder.ConfigurationBuilder
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables()
.Build();
builder.ConfigurationBuilder.AddConfiguration(config);
}
public override void Configure(IFunctionsHostBuilder builder)
{
// Register options
builder.Services.Configure<MyOptions>(builder.GetContext().Configuration.GetSection("Values"));
}
}
public class MyOptions
{
public string MySetting { get; set; }
}
public class MyFunction
{
private readonly IConfiguration _configuration;
private readonly IOptions<MyOptions> _options;
public MyFunction(IConfiguration configuration, IOptions<MyOptions> options)
{
_configuration = configuration;
_options = options;
}
[FunctionName("MyHttpTrigger")]
public IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation($"Value from IConfiguration: {_configuration["MySetting"]}");
log.LogInformation($"Value from IOptions: {_options.Value.MySetting}");
return new OkObjectResult("Check logs for settings values");
}
}
}
还可以使用 IOptions 获取函数应用设置值。
本地输出:-
评论