无法在 Azure Function App Startup 中对自定义对象进行 DI
Unable to DI custom object in Azure Function App Startup
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"}
但是当我尝试在另一个 class 中访问它时,它是空的。
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
没有正确绑定对象。我怎样才能做到这一点?谢谢!
您需要提供 ProjectConfiguration
属性作为 :
分隔键。
假设您有这样的配置 class:
class ProjectConfiguration {
public string Title { get; set; }
public int ANumber { get; set; }
}
它的 JSON 等价物是:
{
"IsEncrypted": false,
"Values": {
// ...
"ProjectConfiguration:Title": "My App",
"ProjectConfiguration:ANumber": 123
}
}
参考文献:
除了@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
方法也有一个重载来指定一个键,大概是为了在配置中使用自定义部分,但我无法让它工作。
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"}
但是当我尝试在另一个 class 中访问它时,它是空的。
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
没有正确绑定对象。我怎样才能做到这一点?谢谢!
您需要提供 ProjectConfiguration
属性作为 :
分隔键。
假设您有这样的配置 class:
class ProjectConfiguration {
public string Title { get; set; }
public int ANumber { get; set; }
}
它的 JSON 等价物是:
{
"IsEncrypted": false,
"Values": {
// ...
"ProjectConfiguration:Title": "My App",
"ProjectConfiguration:ANumber": 123
}
}
参考文献:
除了@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
方法也有一个重载来指定一个键,大概是为了在配置中使用自定义部分,但我无法让它工作。