我应该用 Retrofit 替换对 DynamoDB 的 AWS Android SDK 调用吗?

Should I replace my AWS Android SDK calls to DynamoDB with Retrofit?

我有一个特定的 repo class 用于使 AWS DynamoDB 数据库调用充满类似于下一个的方法:

public List<TestType> getTestTypes()
{
    List<TestType> scanResult = null;
    DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();

    try {
        scanResult = awsConnection.getMapper().scan(TestType.class, scanExpression);
    } catch (Exception e) {
        AWSHelper.logError(e);
    }

    return scanResult;
}

我使用 AWSRepository,它位于 repo 包中。它充满了 AWS DynamoDB 调用(在后台完成)并且 class 像这样开始:

public class AWSRepository implements IAWSDAO
{
    private static AWSRepository instance;
    static AWSConnection awsConnection;

    private AWSRepository()
    {
        awsConnection = new AWSConnection();
    }

    public static synchronized AWSRepository getInstance()
    {
        if(instance == null) instance = new AWSRepository();
        return instance;
    }

    ...AWS call methods...
}

然后是 AWSConnection class:

class AWSConnection
{
    private DynamoDBMapper mapper;
    private AmazonDynamoDBClient ddbClient;

    private static String poolId;
    private static final Regions databaseRegion = Regions.EU_WEST_1;

    AWSConnection()
    {
        Context context = AppSettings.getAppContext();
        Cryptography crypto = new Cryptography();
        String cryptedPoolId = "xxx";
        poolId = crypto.decrypt(cryptedPoolId, TMSecurity.getCryptoParams());

        this.setMapper(initializeAWSIdentityPool_DynamoDBMapper(context));
        this.setDdbClient(initializeAWSIdentityPool_AmazonDynamoDBClient(context));
    }

    DynamoDBMapper getMapper()
    {
        return mapper;
    }

    private void setMapper(DynamoDBMapper mapper)
    {
        this.mapper = mapper;
    }

    AmazonDynamoDBClient getDdbClient()
    {
        return ddbClient;
    }

    private void setDdbClient(AmazonDynamoDBClient ddbClient)
    {
        this.ddbClient = ddbClient;
    }

    // initialize connection

    private static DynamoDBMapper initializeAWSIdentityPool_DynamoDBMapper(Context context)
    {
        CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                context,
                poolId,
                databaseRegion
        );

        AmazonDynamoDBClient ddbClient = Region.getRegion(databaseRegion)
                .createClient(
                        AmazonDynamoDBClient.class,
                        credentialsProvider,
                        new ClientConfiguration()
                );

        return DynamoDBMapper.builder().dynamoDBClient(ddbClient).build();
    }

    private static AmazonDynamoDBClient initializeAWSIdentityPool_AmazonDynamoDBClient(Context context)
    {
        CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                context,
                poolId,
                databaseRegion
        );

        return Region.getRegion(databaseRegion)
                .createClient(
                        AmazonDynamoDBClient.class,
                        credentialsProvider,
                        new ClientConfiguration()
                );
    }
}

build.gradle

...
api group: 'com.amazonaws', name: 'aws-android-sdk-cognito', version: '2.20.1'
api group: 'com.amazonaws', name: 'aws-android-sdk-core', version: '2.33.0'
api group: 'com.amazonaws', name: 'aws-android-sdk-ddb', version: '2.33.0'
api group: 'com.amazonaws', name: 'aws-android-sdk-ddb-mapper', version: '2.33.0'
...

这工作得很好,但我听说每当您需要进行此类调用时,使用 REST 客户端(例如 Retrofit)是一个很好的做法,我正在尝试包括所有可能的最佳做法进入我的应用程序,所以我对我的情况有疑问。

我之所以感到困惑,是因为我问过 AWS 技术人员,他们告诉我我可以像现在一样离开它,没有休息客户端,完全没有问题,AWS 已经准备好以这种方式工作(没有休息客户端)所以我的问题是下一个:

我真的应该包括像 Retrofit 这样的 REST 客户端吗?

投入必要时间的真正好处是什么?

我能否像现在这样保留它,或者我是否以这种方式“违反”了 AWS 的任何最佳实践?

Should I really include a REST client like Retrofit?

不,因为您正在使用 Android 的 AWS SDK。

当您有可用的 SDK 时,使用 REST 客户端调用 AWS REST 实际上是倒退了 API ,内置 automatic retry logic 和许多其他好处。

除非没有适用于您的目标语言的 SDK,否则使用官方 Amazon SDK 始终是最佳选择。


根据您的用例,GitHub readme for the SDK may recommend using the Amplify Framework 用于新项目。

For new projects, we recommend interacting with AWS using the Amplify Framework.

这取决于您的项目,但使用 Amplify DataStore 可能会更好,例如它具有非常酷的内置功能,如实时更新、离线数据访问等。


我会保持您的项目原样并查看 Amplify,看看您是否喜欢它为迁移或新应用程序功能提供的任何 extensive features

如果不是,那么您已经通过使用 SDK 遵循了最佳实践。