【问题标题】:Use IAmazonDynamoDB or IDynamoDBContext (both?)使用 IAmazonDynamoDB 或 IDynamoDBContext(两者都有?)
【发布时间】:2018-06-11 17:06:49
【问题描述】:

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

【问题讨论】:

标签: c# amazon-web-services amazon-dynamodb amazon-cloudformation aws-sdk-net


【解决方案1】:

我们可能需要 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 allows您可以通过以下方式与 DynamoDb 进行更多互动和工作:

  • 创建表
  • 删除表
  • 创建全局索引和备份
  • 等。

您仍然可以直接使用项目,但 API 调用的数量 通过这个接口可用的更大并且允许使用 整个 DynamoDB 服务。

IDynamoDBContext allows 您可以使用以下方法直接处理给定 DynamoDb 表中的项目:

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

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

【讨论】:

  • 我将按照您在我的函数和测试类中所说的那样使用 IDynamoDBContext。我仍然会保留我的 IAmazonDynamoDB 来构建我的表,然后像这样创建我的 IDynamoDBContext:new DynamoDBContext(ddbClient, new DynamoDBContextConfig { Conversion = DynamoDBEntryConversion.V2 });
  • 但是当我对 AWS 使用“LoadAsync”时,我没有收到任何项目(仅当我使用本地 DynamoDB 时)。当我针对 AWS 进行测试时,这可能与我所在的地区有关吗? var ddbClient = new AmazonDynamoDBClient(RegionEndpoint.EUWest1);
  • 很难说鉴于当前信息,因为它是一种有问题的变化。我不知道您的 AWS 设置是什么。我假设您已验证您的 DynamoDb 表在 EUWest1 区域中具有相同的数据?您是否收到错误或任何信息?您可以在 Web UI 中使用相同的查询并获取数据吗?可能最容易用这些细节打开另一个问题。
  • 您的权利。我打开了另一个问题,stackoverflow.com/questions/48076637/…
猜你喜欢
  • 2015-09-04
  • 2014-08-28
  • 2018-09-14
  • 1970-01-01
  • 2011-03-14
  • 2016-03-14
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多