我正在尝试为Azure表存储创建一个通用的CRUD服务。
过去,我一直使用带有Entity Framework的存储库/工作模式单元的SQL。我希望Azure Table Storage具有相同的功能,但我看到的所有示例都要求我的实体从Azure lib中实现TableEntity。
但对我而言,这与SOLID主体相冲突 - 因为我的存储库和我的模型不需要知道Azure可以工作。
所以我想要的是一个服务,我也传递一个实体,并为该服务改变所述类,使其实现TableEntity,从而允许我运行通常的TableStorage CRUD操作,将它映射到我的实体上课然后归还。
答案 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);
全部:)