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>.
Amazon.Lambda.DynamoDBEvents包含 定义的 Nuget 包已经DynamoDBEvent依赖于AWSSDK.DynamoDBv2已经包含.NET DynamoDB 文档模型从 一个对象转换Dictionary<string, AttributeValue>为另一个对象的代码的包。
我们可以编写一个利用FromAttributeMap并FromDocument转换它的辅助方法:
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 本身),但它似乎可以工作。
| 归档时间: |
|
| 查看次数: |
2891 次 |
| 最近记录: |