问题描述
我编写了一个Azure函数,该函数通过Gremlin Server实例连接到CosmosDB数据库。为了创建Gremlin Server实例,我需要保存在local.settings.json
中的一些凭据,以便在本地进行调试,并且希望通过依赖项注入进行检索。
为此,我创建了一个名为CosmosDBCredentials
的自定义类型,已在函数应用程序中添加了Startup类,并在函数中添加了构造函数。
这是我新创建的Startup类的代码:
namespace FunctionApp1
{
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddOptions<CosmosDBCredentials>()
.Configure<IConfiguration>((settings,configuration) =>
{
configuration.GetSection("CosmosDBCredentials").Bind(settings);
});
}
}
}
这是我的函数构造函数的代码,该代码将选项作为参数接收:
public class Function1
{
private readonly CosmosDBCredentials _cosmosDBsettings;
public Function1(IOptions<CosmosDBCredentials> cosmosDBsettings)
{
this._cosmosDBsettings = cosmosDBsettings.Value;
}
当我在本地执行我的函数时,启动类尝试绑定设置时会引发以下异常:
System.NullReferenceException:'对象引用未设置为 对象的实例。'
配置为空。
我对造成这种情况的原因感到非常困惑,因为我遵循了how work with options and settings上的Microsoft文档。
关于启动类似乎无法解析IConfiguration的任何线索吗?
.NET Core项目中的依赖注入是我的一个新手,更具体地说是Azure函数,如果我的理解是错误的,请随时纠正我。
解决方法
由于@Ian Kemp,我终于找到问题的根源:我使用的是EPPlus NuGet软件包的一个版本,该版本强制Microsoft.Extensions.Configuration
更新到3.xx版本,该版本与Azure Functions v2。我重新安装了所有依赖项,这次我选择了一个旧版本的EPPlus NuGet软件包,该软件包依赖于我需要的Microsoft.Extensions.Configuration
版本,从而解决了该问题。