如何将 Dynamodb 流 DynamoDBEvent 新图像或旧图像转换为我自己的具体对象类型 T,而无需手动映射?

Luk*_*uke 0 c# amazon-dynamodb aws-lambda amazon-dynamodb-streams

我有一个从 DynamoDB 流事件触发的 lambda 函数。它接受的对象来自DynamoDBEventNugetAmazon.Lambda.DynamoDBEvents包。

public async Task FunctionHandler(DynamoDBEvent event, ILambdaContext context)
{
    foreach (var record in event.Records)
    {
        var newImage = event.Dynamodb.NewImage; // Or "OldImage" property
        var myObject = new MyObject();

        myObject.ItemId = newImage["ItemId"].N;
        myObject.IdList = newImage["IdList"].NS;
        myObject.CustomerName = newImage["CustomerName"].S;
    }
}
Run Code Online (Sandbox Code Playgroud)

是否可以轻松地将此事件转换为我自己的类,如下所示,例如:

public class MyObject 
{
    public int ItemId { get; set; }
    public List<int> IdList { get; set; }
    public string CustomerName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

无需创建自己的映射器来操作每种类型的每个单独属性的 DynamoDBEvent 对象?

该类AttributeValue包含许多不同的属性,DynamoDb 支持的每种类型都有一个属性,我的对象将来可能会因嵌套属性而变得复杂。

DynamodDB 库中的文档模型似乎已经能够做到这一点......

NewImage并且OldImage类型为Dictionary<string, AttributeValue>.

Luk*_*uke 7

Amazon.Lambda.DynamoDBEvents包含 定义的 Nuget 包已经DynamoDBEvent依赖于AWSSDK.DynamoDBv2已经包含.NET DynamoDB 文档模型从 一个对象转换Dictionary<string, AttributeValue>为另一个对象的代码的包。

我们可以编写一个利用FromAttributeMapFromDocument转换它的辅助方法:

using Amazon;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.DynamoDBv2.Model;

public class DynamoDbStreamToObject
{
    private static readonly AmazonDynamoDBConfig ClientConfig = new AmazonDynamoDBConfig { RegionEndpoint = RegionEndpoint.EUWest1 };
    private static readonly DynamoDBContext DynamoDbContext = new DynamoDbContext(newAmazonDynamoDBClient(ClientConfig));

    public static T Convert<T>(Dictionary<string, AttributeValue> dynamoDbImage) 
    {
        var dynamoDocument = Document.FromAttributeMap(dynamoDbImage);
        return DynamoDbContext.FromDocument<T>(dynamoDocument);
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,它转换Dictionary<string, AttributeValue>为 Amazon DynamoDB Document,然后再转换为您的对象。

现在可以通过使用此辅助方法将您的函数处理程序简化为以下内容:

public async Task FunctionHandler(DynamoDBEvent event, ILambdaContext context)
{
    foreach (var record in input.Records)
    {
        var newImage = event.Dynamodb.NewImage; // Or "OldImage" property
        var myObject = DynamoDbStreamToObject.Convert<MyObject>(newImage);
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这需要一种冗余的 DynamoDBContext(冗余是因为它没有连接到 DynamoDB 本身),但它似乎可以工作。