带有 .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();
}