我从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);
我的测试:
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);
我们可能需要AWS .Net SDK团队中的某个人与此对话,但这是我最好的见解。
亚马逊文档总是很有趣。
文档并没有过于清楚,但IDynamoDBContext位于用于对象持久性数据访问的Amazon.DynamoDbv2.DataModel
命名空间中。
所以我认为IAmazonDynamoDB接口用于针对DynamoDB服务的一般API调用。这两种模式具有重叠功能,因为它们都可以与dynamoDb表中的给定项一起使用。
当然,对于IDynamoDbContext来说,文档非常清楚
用于使用DynamoDB的数据模型模型的上下文接口。用于与服务交互,保存/加载对象等。
https://docs.aws.amazon.com/sdkfornet/v3/apidocs/Index.html
对于IAmazonDynamoDB,它说
用于访问DynamoDB Amazon DynamoDB的界面
IAmazonDynamoDB来自Amazon.DynamoDbv2
命名空间,IDynamoDBContext位于Amazon.DynamoDbv2.DataModel
。
如果您查看它们的文档,虽然您将通过查看方法看到每个可以执行的操作是非常不同的。
IAmazonDynamoDb allows您可以通过以下方式与DynamoDb互动并开展更多工作:
您仍然可以直接使用项目,但通过此接口可用的API调用数量更大,并允许使用整个DynamoDB服务。
在IDynamoDBContext allows中,您可以使用以下方法直接处理给定DynamoDb表中的项目:
一致性始终是编程的关键,因此请始终对要执行相同工作级别的区域使用相同的界面。所以你的代码和测试应该使用相同的接口,因为它们集中在同一个工作范围。希望在此额外说明的基础上,您知道自己所使用的界面。如果您的所有代码都尝试使用DynamoDb表中的项目,那么IDynamoDBContext可能就是您所追求的。