我有一个类,类似如下:
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;
}