C# 使用IAmazonDynamoDB或IDynamoDBContext(两者都有?)
我从AWS SDK模板开始了我的Visual Studio项目。它在函数中使用IDynamoDBContext,在测试中使用IAmazonDynamoDB。 当我收到带有id(散列)的文档时,一切都在保存和接收文档。但当我把一个范围添加到我的表中时,它停止了工作。我所有的测试都是针对AWS dynamoDb的。但我有两种方法让它起作用。第一种方法是下载dynamoDb的本地实例。第二次是在我的函数中将IDynamoDBContext替换为IAmazonDynamoDB时(因此它在函数和测试类中使用了相同的接口)。我不知道正确的解决方案是什么,但为什么要首先使用2个接口?我应该继续挖掘为什么它不能与不同的接口一起工作,还是应该只使用其中一个接口C# 使用IAmazonDynamoDB或IDynamoDBContext(两者都有?),c#,amazon-web-services,amazon-dynamodb,amazon-cloudformation,aws-sdk-net,C#,Amazon Web Services,Amazon Dynamodb,Amazon Cloudformation,Aws Sdk Net,我从AWS SDK模板开始了我的Visual Studio项目。它在函数中使用IDynamoDBContext,在测试中使用IAmazonDynamoDB。 当我收到带有id(散列)的文档时,一切都在保存和接收文档。但当我把一个范围添加到我的表中时,它停止了工作。我所有的测试都是针对AWS dynamoDb的。但我有两种方法让它起作用。第一种方法是下载dynamoDb的本地实例。第二次是在我的函数中将IDynamoDBContext替换为IAmazonDynamoDB时(因此它在函数和测试类中使
// 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);
//IDynamoDBContext(默认)-未保存我的项目(已将其保存在本地DynamoDB中)
var测试=新测试
{
UserId=“Test”,
Id=1
};
等待DDBContext.SaveAsync(测试);
//IAmazonDynamoDB-是否保存了我的项目
var putItemRequest=新的putItemRequest
{
TableName=“TestTable”,
Item=新字典()
{
{“UserId”,新属性值{S=“Test”},
{“Id”,新属性值{N=“1”}
}
};
等待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);
var item=new GetItemRequest
{
TableName=“TestTable”,
关键字=新字典
{
{“UserId”,新属性值{S=“Test”},
{“Id”,新属性值{N=“1”},
},
};
Assert.True((等待此.DDBClient.GetItemAsync(item)).item.Count>0);
我们可能需要AWS.Net SDK团队中的某个人对此发表意见,但以下是我的最佳见解
Amazon文档总是很有趣
文档没有说得太清楚,但是IDynamoDBContext可以在Amazon.DynamoDbv2.DataModel
名称空间中找到,该名称空间用于对象持久性数据访问
因此我认为,IAmazonDynamoDB接口用于针对DynamoDB服务的常规API调用。这两种模式具有重叠的功能,它们都可以处理dynamoDb表中的给定项
当然,文档非常清楚,因为它说,IDynamoDbContext
用于使用DynamoDB的数据模型模式的上下文接口。曾经
与服务交互、保存/加载对象等
对于IAmazonDynamoDB它说
用于访问DynamoDB Amazon DynamoDB的接口
IAmazonDynamoDB来自Amazon.DynamoDbv2
命名空间,而IDynamoDBContext位于Amazon.DynamoDbv2.DataModel
中
如果您查看这两种方法的文档,您会发现,通过查看这些方法,每种操作的性能都非常不同
您可以通过以下方式与DynamoDb进行更多互动和工作:
- 创建表
- 删除表
- 创建全局索引和备份
- 等等
- 拯救
- 质疑
- 扫描
- 装载
一致性始终是编程中的关键,因此,对于需要执行相同级别工作的区域,始终使用相同的接口。因此,您的代码和测试应该使用相同的接口,因为它们专注于相同的工作范围。希望基于这个额外的澄清,你知道你想要什么接口。如果您的代码所要做的只是处理DynamoDb表中的项,那么IDynamoDBContext可能就是您想要的 您是否使用Sort Key属性[DynamoDBRangeKey]更新了测试类(与表匹配的C#对象)?比如这个例子:@AbhayaChauhan是的,我有这个属性。我将使用IDynamoDBContext,正如您在我的函数和测试类中所说的。我仍然会保留我的IAmazonDynamoDB来构建我的表,然后像这样创建我的IDynamoDBContext:new DynamoDBContext(ddbClient,new DynamoDBContextConfig{Conversion=DynamoDBEntryConversion.V2});但是,当我对AWS使用“LoadAsync”时,我没有得到任何项目(只有当我使用本地DynamoDB时)。当我对AWS进行测试时,这可能与我所在的地区有关吗?var ddbClient=新的AmazondynamodClient(RegionEndpoint.EUWest1);鉴于目前的信息,很难说,因为这是一种有争议的变化。我不知道你的AWS设置是什么。我假设您已经验证了DynamoDb表在EUWest1区域中具有相同的数据?您是否收到错误或任何信息?您可以在web UI中使用相同的查询并获取数据吗?也许用这些细节来回答另一个问题最简单。你的权利。我又问了一个问题,