tha*_*sIT 6 c# amazon-web-services aws-cloudformation amazon-dynamodb aws-sdk-net
我从 AWS SDK 模板开始了我的 Visual Studio 项目。它在函数中使用 IDynamoDBContext,在测试中使用 IAmazonDynamoDB。当我收到带有 id(哈希)的文档时,一切都可以保存和接收文档。但是当我向我的表格添加一个范围时它停止工作。我所有的测试都是针对 AWS dynamoDb 的。但我让它以两种方式工作。第一种方法是当我下载 dynamoDb 的本地实例时。第二个是当我在我的函数中将 IDynamoDBContext 替换为 IAmazonDynamoDB 时(因此它在函数和我的测试类中使用相同的接口)。我不知道正确的解决方案是什么,但为什么首先使用 2 个接口?我应该继续研究为什么它不能与不同的接口一起工作,还是应该只使用其中之一?
// IDynamoDBContext (default) - Didn't save my item (did save it in local DynamoDB)
var test = new Test
{
UserId = "Test",
Id = 1
};
await DDBContext.SaveAsync<Test>(test);
// IAmazonDynamoDB - Did save my item
var putItemRequest = new PutItemRequest
{
TableName = "TestTable",
Item = new Dictionary<string, AttributeValue>()
{
{ "UserId", new AttributeValue { S = "Test" }},
{ "Id", new AttributeValue { N = "1" }}
}
};
await DDBContext.PutItemAsync(putItemRequest);
Run Code Online (Sandbox Code Playgroud)
我的测试:
var item = new GetItemRequest
{
TableName = "TestTable",
Key = new Dictionary<string, AttributeValue>
{
{ "UserId", new AttributeValue { S = "Test" } },
{ "Id", new AttributeValue { N = "1" } },
},
};
Assert.True((await this.DDBClient.GetItemAsync(item)).Item.Count > 0);
Run Code Online (Sandbox Code Playgroud)
我们可能需要 AWS .Net SDK 团队中的某个人来讨论这个问题,但这是我最好的见解。
亚马逊文档总是很有趣。
该文档并没有说得太清楚,但IDynamoDBContext位于Amazon.DynamoDbv2.DataModel用于对象持久性数据访问的命名空间中。
所以我认为IAmazonDynamoDB接口用于针对 DynamoDB 服务的通用 API 调用。这两种模式具有重叠的功能,因为两者都可以处理 dynamoDb 表中的给定项目。
当然,文档对于IDynamoDbContext来说非常清楚,它说
使用 DynamoDB 的 DataModel 模式的上下文接口。用于与服务交互、保存/加载对象等。
https://docs.aws.amazon.com/sdkfornet/v3/apidocs/Index.html
对于IAmazonDynamoDB,它说
用于访问 DynamoDB Amazon DynamoDB 的接口
IAmazonDynamoDB来自Amazon.DynamoDbv2命名空间,而IDynamoDBContext位于 Amazon.DynamoDbv2.DataModel.
如果您查看它们的文档,尽管您会通过查看方法看到每个可以执行的操作非常不同。
IAmazonDynamoDb 允许您通过以下方式与 DynamoDb 进行更多交互和工作:
您仍然可以直接使用项目,但通过此接口可用的 API 调用数量更大,并且允许使用整个 DynamoDB 服务。
虽然IDynamoDBContext 允许您使用以下方法直接处理给定 DynamoDb 表中的项目:
一致性始终是编程的关键,因此对于旨在执行相同级别工作的区域,请始终使用相同的界面。所以你的代码和测试应该使用相同的接口,因为它们专注于相同的工作范围。希望基于额外的说明,您知道您在追求什么界面。如果您的所有代码都试图处理 DynamoDb 表中的项目,那么 IDynamoDBContext 可能就是您所追求的。
| 归档时间: |
|
| 查看次数: |
2683 次 |
| 最近记录: |