无法在 Azure Function App Startup 中 DI 自定义对象

Posted

技术标签:

【中文标题】无法在 Azure Function App Startup 中 DI 自定义对象【英文标题】:Unable to DI custom object in Azure Function App Startup 【发布时间】:2021-10-03 04:36:03 【问题描述】:

local.settings.json


  "IsEncrypted": false,
  "Values": 
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "tester": "e=e",
    "ProjectConfiguration": "\"tester\": \"tes22\""
  

Startup.cs

    class Startup : FunctionsStartup
    

        public override void Configure(IFunctionsHostBuilder builder)
        
            builder.Services.AddOptions<ProjectConfiguration>()
                .Configure<IConfiguration>((option, configuration) =>
                
                    System.Diagnostics.Debug.WriteLine($"hello:configuration.GetSection("ProjectConfiguration").Value");
                    configuration.GetSection("ProjectConfiguration").Bind(option);
                );
        
    

我可以打印出hello:"tester": "tes22",但是当我尝试在另一个类中访问它时,它为空。

    public class InitFunction
    
        private readonly ProjectConfiguration _projectConfiguration;

        public InitFunction(Microsoft.Extensions.Options.IOptions<ProjectConfiguration> options)
        
            _projectConfiguration = options.Value;
            System.Diagnostics.Debug.WriteLine(JsonConvert.SerializeObject(options.Value));
        

打印出来的option.value是"tester":null

似乎.bind 没有正确绑定对象。我怎样才能做到这一点?谢谢!

【问题讨论】:

【参考方案1】:

您需要提供ProjectConfiguration 属性作为: 分隔键。

假设你有一个这样的配置类:

class ProjectConfiguration 
    public string Title  get; set; 
    public int ANumber  get; set; 

它的 JSON 等价物是:


  "IsEncrypted": false,
  "Values": 
    // ...
    "ProjectConfiguration:Title": "My App",
    "ProjectConfiguration:ANumber": 123
  

参考:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#working-with-options-and-settings

【讨论】:

有没有其他方法可以通过 json 对象而不是使用分隔键来做到这一点? 您是否尝试将配置设置为实际的 JSON 对象:"ProjectConfiguration": "tester": "tes22"?这适用于 ASP.NET Core,但我没有使用过 Azure Funcs,所以我不确定它是否适用。 我可以看看local.setting.json 的样子吗?我应该把那个 JSON 对象放在“值”下吗? 像这样:"IsEncrypted": false, "Value":"ProjectConfiguration":"Title": "My app", "ANumber": "123"。我省略了一些值来说明问题。 我已经尝试过了,我认为 local.settings.json 中的“值”只接受字符串:字符串键值对【参考方案2】:

除了@abdusco 的回答,如果你不想要:-delimited 键,你可以将ProjectConfiguration 直接绑定到local.settings.config"Values" 部分


    "IsEncrypted": false,
    "Values": 
        // ...
        "Tester": "tes22"
    

public class ProjectConfiguration

    public string Tester  get; set; 

builder.Services
  .AddOptions<ProjectConfiguration>()
  .Configure<IConfiguration>((pc, config) => config.Bind(pc));

理论上Bind 方法也有一个重载来指定一个键,大概是在配置中使用自定义部分,但我无法让它工作。

【讨论】:

以上是关于无法在 Azure Function App Startup 中 DI 自定义对象的主要内容,如果未能解决你的问题,请参考以下文章

azure function app javascript 无法读取 Post 请求的正文

Azure Function App:身份验证中断开发门户

发布后似乎没有触发 Azure Function App

如何使用 node.js 运行时访问 Azure Function App 函数中的 multipart/form-data

在 Postman 中为受 Azure AD B2C 保护的 Azure Function App 请求访问令牌

Azure Function App 对 Webhook 的初始响应