0

Azure TableServiceEntities の実装を抽象化して、任意の型のオブジェクトを受け取り、そのオブジェクトのプロパティを TableServiceEntity のプロパティとして使用するエンティティを 1 つ持つようにしたいと考えています。

私の基本オブジェクトは次のようになります

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

まだ具象型を使用したいようです。したがって、 SomeEntity は少し冗長です。実際、TableServiceEntity は既に抽象クラスです。TableServiceEntity から SomeObject を派生させることができます。私の経験から、これによりシナリオに問題が発生することはありません。

さらに、カスタム SomeEntity を使用しても、コードの最後の部分で具体的な SomeObject クラスへの依存を削除することはできません。

よろしくお願いします、

明徐。

于 2012-04-19T06:59:38.213 に答える
0

辞書オブジェクトの永続化を含む多くの抽象化をサポートする代替の Azure テーブル ストレージ クライアント、Lucifure Stash を F# で作成しました。Lucifure Stash は、64K を超える大規模なデータ列、配列とリスト、列挙型、すぐに使えるシリアル化、ユーザー定義のモーフィング、パブリックおよびプライベート プロパティとフィールドなどもサポートしています。http://www.lucifure.com または NuGet.com から、個人使用であれば無料で入手できます。

あなたが達成しようとしているものは、任意のエンティティの単一のジェネリック クラスであり、辞書型の [StashPool] 属性を使用して、Lucifure Stash に実装できます。

于 2012-04-18T21:45:15.633 に答える
0

ソースコードはあなたが試みていることを模倣していると思いますが、Azure テーブルストレージへの異なるアプローチについて洞察に満ちた根拠があります

http://lokadcloud.codeplex.com/

于 2012-04-18T21:09:13.807 に答える