使现有实体实现TableEntity

时间:2013-12-29 21:18:26

标签: c# azure repository-pattern azure-table-storage

我正在尝试为Azure表存储创建一个通用的CRUD服务。

过去,我一直使用带有Entity Framework的存储库/工作模式单元的SQL。我希望Azure Table Storage具有相同的功能,但我看到的所有示例都要求我的实体从Azure lib中实现TableEntity。

但对我而言,这与SOLID主体相冲突 - 因为我的存储库和我的模型不需要知道Azure可以工作。

所以我想要的是一个服务,我也传递一个实体,并为该服务改变所述类,使其实现TableEntity,从而允许我运行通常的TableStorage CRUD操作,将它映射到我的实体上课然后归还。

3 个答案:

答案 0 :(得分:2)

我自己想通了。我使用了一个动态对象来实现ITableEntity的要求。

如果有人有兴趣,我写了一篇关于我是如何做到这一点的博客。

http://bretthargreaves.wordpress.com/2014/01/11/azure-table-storage-with-repository-pattern/

答案 1 :(得分:1)

这是一种更简单的方法,您可以创建模型,加上系统列PartitionKey,RowKey,Timestamp和ETag。

{_id:an id}

此模型没有对AzureTables的任何引用,因此我们将其保持为SOLID。

然后我们创建存储库,并在其中创建一个LogEntityWrapper,它将帮助使用Azure表。

public class LogModel
{
    public string LogMessage { get; set; }

    public string PartitionKey { get;set;}
    public string RowKey { get; set; }
    public DateTimeOffset Timestamp { get; set; }
    public string ETag { get; set; }
}

答案 2 :(得分:0)

我编写了一个通用API,它通过使用递归反射展平复杂对象来执行从任何复杂对象到EntityProperty字典的转换。然后,您可以将实体属性字典作为DynamicTableEntity写入Azure表存储。

当您阅读DynamicTableEntity时,API会将转换返回到复杂对象。

这个API的强大之处在于它适用于任何具有嵌套属性的复杂对象,这些属性本身可能是具有其他嵌套属性的复杂对象。

随意查看并使用:) https://www.nuget.org/packages/ObjectFlattenerRecomposer/

用法:

//Flatten object of type Order) and convert it to EntityProperty Dictionary
 Dictionary<string, EntityProperty> flattenedProperties = ObjectFlattenerRecomposer.Flatten(order);

// Create a DynamicTableEntity and set its PK and RK
DynamicTableEntity dynamicTableEntity = new DynamicTableEntity(partitionKey, rowKey);

dynamicTableEntity.Properties = flattenedProperties;

// Write the DynamicTableEntity to Azure Table Storage using client SDK


//Read the entity back from AzureTableStorage as DynamicTableEntity using the same PK and RK

DynamicTableEntity entity = [Read from Azure using the PK and RK];

//Convert the DynamicTableEntity back to original complex object.    
Order order = ObjectFlattenerRecomposer.ConvertBack<Order>(entity.Properties);

全部:)