gpt4 book ai didi

c# - 如何修改在 Azure Functions 中 native 注入(inject)的 IConfiguration

转载 作者:行者123 更新时间:2023-12-03 15:42:20 26 4
gpt4 key购买 nike

我们需要 添加提供给 native 提供给 Azure Functions 的 native IConfiguration 的配置提供程序。目前我们完全是替换 使用我们的自定义 Iconfiguration 使用以下代码:

public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
...

var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddAzureKeyVault(...)
.AddJsonFile("local.settings.json", true, true)
.AddEnvironmentVariables()
.Build();

builder.Services.AddSingleton<IConfiguration>(configuration);

builder.Services.AddSingleton<IMyService, MyService>();
}
}
一些上下文
MyService 的构造函数值需要来自 KeyVault 提供程序以及其他实例,如 Application Insights 等。如果我们保留默认的 IConfiguration,它就没有 KeyVault 值。如果我们使用工厂创建 MyService 实例,我们需要手动提供 App Insights 实例等。目前替换 IConfiguration 编译和函数运行。但它破坏了其他默认行为,例如不从 host.json 获取配置(我们正在尝试 configure 队列触发器)。使用默认的 IConfiguration 可以正确读取 host.json 中的设置。

最佳答案

有一些关于使用 .NET Core Azure 函数的评论:

  • 在本地运行时,框架默认为您加载 local.settings.json。
  • 在消耗计划上运行时,您应该避免从 appsettings.json 或其他文件中读取配置值。 Functions docs
  • 一般来说,你应该避免绕过IConfiguration。目的。正如@Dusty 提到的,首选方法是使用 IOptions图案。
  • 如果您尝试从 Azure Key Vault 读取值,则无需添加 AddAzureKeyVault()因为您可以并且应该使用 Azure Key Vault References 在 azure 门户中进行配置。 Key Vault Docs .通过这样做,azure 函数配置机制不知道/关心它在哪里运行,如果您在本地运行,它将从 local.settings.json 加载,如果已部署,那么它将从 Azure 应用程序配置和如果您需要 Azure Key Vault 集成,这一切都通过 Azure Key Vault 引用完成。
  • 我认为 Azure 函数配置与使用 appsettings.json 的传统 .NET 应用程序不同,这也是关键。
  • 由于您需要一一添加设置,因此配置 azure functions 应用程序可能会变得很麻烦。我们通过使用 Azure App Configuration. 解决了这个问题。你也可以将它连接到 Azure Key Vault。
  • Azure Functions 自动添加 Application Insights。 Docs

  • 话虽如此,即使不建议执行以下操作,您仍然可以完成您想要的事情。请记住,您还可以通过 AddAzureKeyVault() 在以下代码中添加 keystore 引用
    var configurationBuilder = new ConfigurationBuilder();
    var descriptor = builder.Services.FirstOrDefault(d => d.ServiceType == typeof(IConfiguration));
    if (descriptor?.ImplementationInstance is IConfiguration configRoot)
    {
    configurationBuilder.AddConfiguration(configRoot);
    }

    // Conventions are different between Azure and Local Development and API
    // https://github.com/Azure/Azure-Functions/issues/717
    // Environment.CurrentDirectory doesn't cut it in the cloud.
    // https://stackoverflow.com/questions/55616798/executioncontext-in-azure-function-iwebjobsstartup-implementation
    var localRoot = Environment.GetEnvironmentVariable("AzureWebJobsScriptRoot");
    var actualRoot = $"{Environment.GetEnvironmentVariable("HOME")}/site/wwwroot";
    var basePath = localRoot ?? actualRoot;
    var configuration = configurationBuilder
    .SetBasePath(basePath)
    .AddJsonFile("local.settings.json", optional: true, reloadOnChange: false)
    .AddEnvironmentVariables()
    .Build();

    builder.Services.Replace(ServiceDescriptor.Singleton(typeof(IConfiguration), configuration));
    如果您需要更多输入/澄清,请告诉我,我会相应地更新我的答案。

    关于c# - 如何修改在 Azure Functions 中 native 注入(inject)的 IConfiguration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62960764/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com