【问题标题】:Unable to DI custom object in Azure Function App Startup无法在 Azure Function App Startup 中 DI 自定义对象
【发布时间】: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 没有正确绑定对象。我怎样才能做到这一点?谢谢!

【问题讨论】:

    标签: c# .net-core dependency-injection azure-functions


    【解决方案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 方法也有一个重载来指定一个键,大概是在配置中使用自定义部分,但我无法让它工作。

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 2023-03-02
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多