0

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

4 回答 4

0

我写了一篇关于表存储上下文的博客文章,通过指定实体类型来描述实体。也许它可以帮助你http://wblo.gs/a2G

于 2012-04-19T04:17:55.720 回答
0

看看 Lokad Cloud O/C 映射器,我认为源代码模仿了您正在尝试的内容,但它对 Azure 表存储的不同方法具有深刻的基本原理。

http://lokadcloud.codeplex.com/

于 2012-04-18T21:09:13.807 回答
0

看来您仍然想使用具体类型。因此, SomeEntity 有点多余。实际上,TableServiceEntity 已经是一个抽象类。您可以从 TableServiceEntity 派生 SomeObject。根据我的经验,这不会给您的方案带来任何问题。

此外,即使使用您的自定义 SomeEntity,也无法消除对最后一段代码中具体 SomeObject 类的依赖。

此致,

明旭。

于 2012-04-19T06:59:38.213 回答
0

我用 F# 编写了一个备用 Azure 表存储客户端 Lucifure Stash,它支持许多抽象,包括持久化字典对象。Lucifure Stash 还支持大于 64K 的大型数据列、数组和列表、枚举、开箱即用的序列化、用户定义的变形、公共和私有属性和字段等等。它可在http://www.lucifure.com 或通过 NuGet.com 免费供个人使用。

您试图实现的目标是任何实体的单个泛型类,可以通过在字典类型上使用 [StashPool] 属性在 Lucifure Stash 中实现。

于 2012-04-18T21:45:15.633 回答