为什么在 Azure Functions 依赖项注入中使用 IConfiguration 是一件坏事

Why is the use of IConfiguration a bad thing in Azure Functions Dependency Injection

提问人:GoldieLocks 提问时间:11/15/2023 更新时间:11/15/2023 访问量:29

问:

这里它指出:

注入 IConfiguration 可能会导致意外行为。

没有太多解释这意味着什么。有谁知道:

这种情况发生在什么情况下?

这是什么行为?

为什么这是一件坏事?

依赖项注入 azure-functions

评论

0赞 GoldieLocks 11/16/2023
它实际上比最初看起来更糟糕。在同一文档的后面,它指出: > 以下服务可以安全地用作应用程序中的依赖项: > Microsoft.Extensions.Configuration.IConfiguration 单例运行时配置

答:

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

enter image description here

enter image description here

我的函数.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 获取函数应用设置值。

本地输出:-

enter image description here