9

我从 AWS 开发工具包模板开始了我的 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);
4

1 回答 1

11

我们可能需要 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 可能就是您所追求的。

于 2018-01-01T23:16:21.323 回答