我想抽象出我的Azure TableServiceEntities的实现,以便我有一个实体,它将采用任何类型的对象,使用该对象的属性作为TableServiceEntity中的属性。
所以我的基础对象就像
public class SomeObject
{
[EntityAttribute(PartitionKey=true)]
public string OneProperty {get; set:}
[EntityAttribute(RowKey=true)]
public string TwoProperty {get; set;}
public string SomeOtherProperty {get;set;}
}
public class SomeEntity<T> : TableServiceEntity
{
public SomeEntity(T obj)
{
foreach (var propertyInfo in properties)
{
object[] attributes = propertyInfo.GetCustomAttributes(typeof (DataObjectAttributes), false);
foreach (var attribute in attributes)
{
DataObjectAttributes doa = (DataObjectAttributes) attribute;
if (doa.PartitionKey)
PartitionKey = propertyInfo.Name;
}
}
}
}
然后我可以像这样访问上下文中的实体
var objects =
(from entity in context.CreateQuery<SomeEntity>("SomeEntities") select entity);
var entityList = objects.ToList();
foreach (var obj in entityList)
{
var someObject = new SomeObject();
SomeObject.OneProperty = obj.OneProperty;
SomeObject.TwoProperty = obj.TwoProperty;
}
这似乎不应该那么困难,但我有一种感觉,我一直在寻找太多可能的解决方案,并且只是设法让自己迷惑。
感谢您的任何指示。
答案 0 :(得分:0)
Take a look at Lokad Cloud O/C mapper我认为源代码模仿了您正在尝试的内容,但对其不同的Azure表存储方法有深刻的理由。
答案 1 :(得分:0)
我在F#,Lucifure Stash中编写了一个备用Azure表存储客户端,它支持许多抽象,包括持久化字典对象。 Lucifure Stash还支持大数据列&gt; 64K,阵列&amp;列表,枚举,开箱即用的序列化,用户定义的变形,公共和私有属性和字段等。 它可以在http://www.lucifure.com或通过NuGet.com免费供个人使用。
您尝试实现的是任何实体的单个泛型类,可以通过使用字典类型的[StashPool]属性在Lucifure Stash中实现。
答案 2 :(得分:0)
我通过指定实体类型编写了一篇关于表存储上下文,实体的博客文章。也许它可以帮助你http://wblo.gs/a2G
答案 3 :(得分:0)
您似乎仍想使用具体类型。因此,SomeEntity有点多余。实际上,TableServiceEntity已经是一个抽象类。您可以从TableServiceEntity派生SomeObject。根据我的经验,这不会给您的方案带来任何问题。
此外,即使使用自定义SomeEntity,也无法在最后一段代码中删除对具体SomeObject类的依赖。
最诚挚的问候,
徐明。