如何在 c# .NET 中的方法中参数化 Azure 的<TElement> TableOperation.Retrieve。



我有一个类,类似如下:

public class Table : ITable
    {
        private CloudStorageAccount storageAccount;
        public Table()
        {
            var storageAccountSettings = ConfigurationManager.ConnectionStrings["AzureStorageConnection"].ToString();
            storageAccount = CloudStorageAccount.Parse(storageAccountSettings);
        }
        public async Task<TableResult> Retrieve(string tableReference, string partitionKey, string rowKey)
        {
            var tableClient = storageAccount.CreateCloudTableClient();
            var table = tableClient.GetTableReference(tableReference);
            TableOperation retrieveOperation = TableOperation.Retrieve<SomeDomainModelType>(partitionKey, rowKey);
            TableResult retrievedResult = await table.ExecuteAsync(retrieveOperation);
            return retrievedResult;
        }
    }

这个类是一个包装器,用于从Azure表中检索单个实体。它被包装起来,并符合一个接口,所以它可以在测试期间用微软伪造的存根。它目前可以工作,但是如果下面是更通用的,它会更优雅:

TableOperation retrieveOperation = TableOperation.Retrieve<SomeDomainModelType>(partitionKey, rowKey);

我的问题是我如何参数化<SomeDomainModelType>,以便我可以在域模型中使用任何类型的方法?什么好主意吗?

回顾《c#泛型编程指南》,特别是泛型方法部分。基本上,定义一个泛型方法,它可以接受一个ITableEntity:

    public async Task<TableResult> Retrieve<T>(string tableReference, string partitionKey, string rowKey) where T : ITableEntity
    {
        var tableClient = storageAccount.CreateCloudTableClient();
        var table = tableClient.GetTableReference(tableReference);
        TableOperation retrieveOperation = TableOperation.Retrieve<T>(partitionKey, rowKey);
        TableResult retrievedResult = await table.ExecuteAsync(retrieveOperation);
        return retrievedResult;
    }

实际上,您可以返回retrievedResult。直接作为实体的结果:

    public async Task<TEntity> Retrieve<TEntity>(string tableReference, string partitionKey, string rowKey) : where TEntity : ITableEntity
    {
        var tableClient = storageAccount.CreateCloudTableClient();
        var table = tableClient.GetTableReference(tableReference);
        TableOperation retrieveOperation = TableOperation.Retrieve<TEntity>(partitionKey, rowKey);
        TableResult retrievedResult = await table.ExecuteAsync(retrieveOperation);
        return (TEntity)retrievedResult.Result;
    }

相关内容

最新更新