带有 .Net SDK 的 AWS SQS Lambda - DynamoDBContext 依赖注入抛出 NullReferenceException
AWS SQS Lambda with .Net SDK - DynamoDBContext dependency injection throws NullReferenceException
我有一个由 AWS Toolkit 为 Visual Studio 生成的简单函数,我正在尝试使用依赖注入设置 DynamoDBContext。但是,每当我尝试从 IServiceProvider
中获取 IDynamoDBContext
时,我得到的 NullReferenceException
没有任何有用的信息。
任何人都可以帮助我了解我所缺少的东西吗?
public interface IMyDependency { }
public class MyDependency : IMyDependency { }
public class Function
{
public Function()
{
var services = ConfigureServices();
// OK
var dependency = services.GetService<IMyDependency>();
// NullReferenceException
var db = services.GetService<IDynamoDBContext>();
}
private IServiceProvider ConfigureServices()
{
var services = new ServiceCollection();
services.AddTransient<IMyDependency, MyDependency>();
services.AddAWSService<IAmazonDynamoDB>();
services.AddTransient<IDynamoDBContext, DynamoDBContext>();
return services.BuildServiceProvider();
}
}
我的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<AWSProjectType>Lambda</AWSProjectType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Amazon.Lambda.Core" Version="1.2.0" />
<PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.1.0" />
<PackageReference Include="Amazon.Lambda.SQSEvents" Version="1.2.0" />
<PackageReference Include="AWSSDK.DynamoDBv2" Version="3.5.3.2" />
<PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.3.101" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.0" />
</ItemGroup>
</Project>
编辑:
来自抛出的异常的堆栈跟踪:
at Amazon.Extensions.NETCore.Setup.ClientFactory.CreateConfig(Type serviceInterfaceType, AWSOptions options) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\extensions\src\AWSSDK.Extensions.NETCore.Setup\ClientFactory.cs:line 171
at Amazon.Extensions.NETCore.Setup.ClientFactory.CreateServiceClient(ILogger logger, Type serviceInterfaceType, AWSOptions options) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\extensions\src\AWSSDK.Extensions.NETCore.Setup\ClientFactory.cs:line 89
at Amazon.Extensions.NETCore.Setup.ClientFactory.CreateServiceClient(IServiceProvider provider) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\extensions\src\AWSSDK.Extensions.NETCore.Setup\ClientFactory.cs:line 75
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
at AWSLambda.Example.Function..ctor() in C:\Source\Git\AWSLambda.Example\AWSLambda.Example\Function.cs:line 36
问题是我必须添加默认的 AWS 选项。
我在appsettings中添加了JSON配置:
"AWS": {
"Region": "eu-west-2"
}
在函数构造函数中构建配置:
public Function()
{
var config = ConfigureAppConfiguration();
var services = ConfigureServices(config);
// ...
}
private IConfiguration ConfigureAppConfiguration()
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
.AddEnvironmentVariables()
.Build();
}
并更新了 ConfigureServices 方法以添加 AWS 选项:
private IServiceProvider ConfigureServices(IConfiguration config)
{
var services = new ServiceCollection();
services.AddTransient<IMyDependency, MyDependency>();
services.AddDefaultAWSOptions(config.GetAWSOptions()); // <-- This was mssing
services.AddAWSService<IAmazonDynamoDB>();
services.AddTransient<IDynamoDBContext, DynamoDBContext>();
return services.BuildServiceProvider();
}
我有一个由 AWS Toolkit 为 Visual Studio 生成的简单函数,我正在尝试使用依赖注入设置 DynamoDBContext。但是,每当我尝试从 IServiceProvider
中获取 IDynamoDBContext
时,我得到的 NullReferenceException
没有任何有用的信息。
任何人都可以帮助我了解我所缺少的东西吗?
public interface IMyDependency { }
public class MyDependency : IMyDependency { }
public class Function
{
public Function()
{
var services = ConfigureServices();
// OK
var dependency = services.GetService<IMyDependency>();
// NullReferenceException
var db = services.GetService<IDynamoDBContext>();
}
private IServiceProvider ConfigureServices()
{
var services = new ServiceCollection();
services.AddTransient<IMyDependency, MyDependency>();
services.AddAWSService<IAmazonDynamoDB>();
services.AddTransient<IDynamoDBContext, DynamoDBContext>();
return services.BuildServiceProvider();
}
}
我的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<AWSProjectType>Lambda</AWSProjectType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Amazon.Lambda.Core" Version="1.2.0" />
<PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.1.0" />
<PackageReference Include="Amazon.Lambda.SQSEvents" Version="1.2.0" />
<PackageReference Include="AWSSDK.DynamoDBv2" Version="3.5.3.2" />
<PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.3.101" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="5.0.0" />
</ItemGroup>
</Project>
编辑:
来自抛出的异常的堆栈跟踪:
at Amazon.Extensions.NETCore.Setup.ClientFactory.CreateConfig(Type serviceInterfaceType, AWSOptions options) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\extensions\src\AWSSDK.Extensions.NETCore.Setup\ClientFactory.cs:line 171
at Amazon.Extensions.NETCore.Setup.ClientFactory.CreateServiceClient(ILogger logger, Type serviceInterfaceType, AWSOptions options) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\extensions\src\AWSSDK.Extensions.NETCore.Setup\ClientFactory.cs:line 89
at Amazon.Extensions.NETCore.Setup.ClientFactory.CreateServiceClient(IServiceProvider provider) in D:\JenkinsWorkspaces\trebuchet-stage-release\AWSDotNetPublic\extensions\src\AWSSDK.Extensions.NETCore.Setup\ClientFactory.cs:line 75
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite, RuntimeResolverContext context, ServiceProviderEngineScope serviceProviderEngine, RuntimeResolverLock lockType)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitRootCache(ServiceCallSite singletonCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSiteMain(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitDisposeCache(ServiceCallSite transientCallSite, RuntimeResolverContext context)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(ServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider)
at AWSLambda.Example.Function..ctor() in C:\Source\Git\AWSLambda.Example\AWSLambda.Example\Function.cs:line 36
问题是我必须添加默认的 AWS 选项。
我在appsettings中添加了JSON配置:
"AWS": {
"Region": "eu-west-2"
}
在函数构造函数中构建配置:
public Function()
{
var config = ConfigureAppConfiguration();
var services = ConfigureServices(config);
// ...
}
private IConfiguration ConfigureAppConfiguration()
{
return new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
.AddEnvironmentVariables()
.Build();
}
并更新了 ConfigureServices 方法以添加 AWS 选项:
private IServiceProvider ConfigureServices(IConfiguration config)
{
var services = new ServiceCollection();
services.AddTransient<IMyDependency, MyDependency>();
services.AddDefaultAWSOptions(config.GetAWSOptions()); // <-- This was mssing
services.AddAWSService<IAmazonDynamoDB>();
services.AddTransient<IDynamoDBContext, DynamoDBContext>();
return services.BuildServiceProvider();
}