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



local.settings.json

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

启动.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.打印出的值为{"tester":null}

.bind似乎没有正确绑定对象。我该怎么做?非常感谢。

您需要将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://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection#working-具有选项和设置

除了@abdusco的答案之外,如果您不想要:分隔的密钥,您可以将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方法也有一个重载来指定一个键,大概是为了在配置中使用自定义部分,但我没能让它工作。

最新更新