Abstract Azure TableServiceEntity

时间:2012-04-18 19:36:55

标签: azure azure-storage azure-table-storage

我想抽象出我的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;
        }

这似乎不应该那么困难,但我有一种感觉,我一直在寻找太多可能的解决方案,并且只是设法让自己迷惑。

感谢您的任何指示。

4 个答案:

答案 0 :(得分:0)

Take a look at Lokad Cloud O/C mapper我认为源代码模仿了您正在尝试的内容,但对其不同的Azure表存储方法有深刻的理由。

http://lokadcloud.codeplex.com/

答案 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类的依赖。

最诚挚的问候,

徐明。