使用IAmazonDynamoDB或IDynamoDBContext(两者都可以?)

12
我从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);

你是否已经在你的测试类(与表匹配的C#对象)中更新了排序键属性[DynamoDBRangeKey]?就像这个例子:https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/dynamodb-intro.html#dynamodb-intro-apis-object-persistence - Abhaya Chauhan
@AbhayaChauhan 是的,我有那个属性。 - thatsIT
1个回答

14
我们可能需要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可能是您想要的。


我会像你说的那样在我的函数和测试类中使用IDynamoDBContext。我仍然会保留我的IAmazonDynamoDB来构建我的表,然后像这样创建我的IDynamoDBContext:new DynamoDBContext(ddbClient, new DynamoDBContextConfig { Conversion = DynamoDBEntryConversion.V2 }); - thatsIT
但是当我使用'LoadAsync'针对AWS(仅在使用本地DynamoDB时)时,我没有收到任何项目。当我针对AWS进行测试时,这可能与我的区域有关吗? var ddbClient = new AmazonDynamoDBClient(RegionEndpoint.EUWest1); - thatsIT
鉴于当前信息的变化,很难说。我不知道你的AWS设置是什么。我会假设您已经验证了您的DynamoDb表在EUWest1区域具有相同的数据?您是否收到任何错误或信息?您能否在Web UI中使用相同的查询并获取数据?最好打开另一个问题,并提供这些详细信息。 - ToddB
没错。我又开了一个问题,https://stackoverflow.com/questions/48076637/idynamodbcontext-saveasync-doesnt-save-my-item - thatsIT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接