使用 IAmazonDynamoDB 或 IDynamoDBContext(两者?)

Use IAmazonDynamoDB or IDynamoDBContext (both?)

我从 AWS SDK 模板开始了我的 Visual Studio 项目。它在函数中使用 IDynamoDBContext,在测试中使用 IAmazonDynamoDB。 当我收到带有 ID(哈希)的文件时,一切都可以保存和接收文件。但是当我向我的 table 添加范围时它停止工作。我所有的测试都是针对 AWS dynamoDb 的。但我让它以两种方式工作。第一种方式是当我下载 dynamoDb 的本地实例时。第二次是我在函数中将 IDynamoDBContext 替换为 IAmazonDynamoDB(因此它在函数和测试中使用相同的接口 class)。我不知道正确的解决方案是什么,但为什么首先使用 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 团队的某个人来讨论这个问题,但这是我最好的见解。

Amazon 文档总是很有趣。

文档并没有说得太清楚,但是 IDynamoDBContext 位于 Amazon.DynamoDbv2.DataModel 命名空间中,用于对象持久性数据访问。

所以我认为 IAAmazonDynamoDB 接口用于针对 DynamoDB 服务的一般 API 调用。这两种模式具有重叠的功能,因为它们都可以处理 dynamoDb table 中的给定项目。

当然,文档非常清楚 IDynamoDbContext 它说

Context interface for using the DataModel mode of DynamoDB. Used to interact with the service, save/load objects, etc.

https://docs.aws.amazon.com/sdkfornet/v3/apidocs/Index.html

对于 IAmazonDynamoDB 它说

Interface for accessing DynamoDB Amazon DynamoDB

IAmazonDynamoDB 来自 Amazon.DynamoDbv2 命名空间,IDynamoDBContext 位于 Amazon.DynamoDbv2.DataModel.

如果您查看它们的文档,虽然通过查看方法您会发现每个操作的性能都非常不同。

IAmazonDynamoDb allows 您可以通过以下方式与 DynamoDb 进行更多交互和合作:

  • 正在创建 tables
  • 正在删除 tables
  • 正在创建全局索引和备份

您仍然可以直接使用项目,但调用次数 API 通过此界面可用的更大,并允许使用 整体 DynamoDB 服务。

虽然 IDynamoDBContext allows 您可以直接使用给定 DynamoDb table 中的项目,方法如下:

  • 保存
  • 查询
  • 扫描
  • 加载

一致性始终是编程的关键,因此对于旨在执行相同级别工作的区域始终使用相同的界面。因此,您的代码和测试应该使用相同的界面,因为它们专注于相同的工作范围。希望基于这些额外的说明,您知道您要使用的是什么接口。如果您所有的代码都试图做的是处理 DynamoDb table 中的项目,那么 IDynamoDBContext 可能就是您所追求的。