1

リポジトリ パターンを介して保持したい一連のエンティティがあります。

バニラ SQL は非常に簡単です。エンティティを取得/返すクエリを持ついくつかのメソッドを記述します。

Azure テーブル ストレージも非常に単純ですが、私が見たほとんどの実装では、エンティティを一般的な Azure 基本クラスから派生させたいと考えています。(TableServiceEntityなど)

EF も同様に機能しますが、もう少し多くのエンティティを所有したいと考えています。

SQL と Azure のテーブルの両方を抽象化して、エンティティをいずれかの方法で永続化できるようにする良い方法はありますか?

双方向のサポートは実際には必要ありません。サポートが必要な 2 つの異なる展開タイプが必要なだけです。

モデルが永続化されているリポジトリにできるだけ依存せず、可能であれば依存関係を最小限に抑えて (なし?!)、モデルを望んでいます。

4

1 に答える 1

2

これは実行可能です。私はかなり大規模なクライアントのためにこれを設計するのを手伝いました。

1) TableServiceEntity から継承するのではなく、エンティティに次の属性を実装します。

[DataServiceKey(new string[] { "PartitionKey", "RowKey" }), Serializable]

また、エンティティに PartitionKey、RowKey、および Timestamp を提供する何らかのインターフェイスをエンティティに実装します。

public interface ITableEntity
{
    string PartitionKey { get; set; }
    string RowKey { get; set; }
    DateTime Timestamp { get; set; }
}

少なくともこのアプローチにより、独自のエンティティに対して独自の継承戦略を持つことができ、多重継承がないために制限されることはありません。キーを複製する代わりに、PartitionKey と RowKey が実際のキー プロパティへのパススルーを提供するようにしてください。

public string PartitionKey
{
       get
       {
          return this.Id;
       }
       set
       {
         this.Id = value;
       }
}

2) システムには、リレーショナル固有と ATS 固有の 2 種類のリポジトリがあることに注意してください。

3) EDMX を介してエンティティを生成し、部分クラスを使用して ITableEntity および DataServiceKey 属性を挿入できます。

4) ATS にデータを保存する方法は、ドメインでモデル化する方法とは異なるため、ある時点で、永続化のためにエンティティの変換を行うために ATS 固有のリポジ​​トリが必要になります (これは特に階層データまたはリレーショナル データに関連します)

HTH

于 2012-07-18T22:32:03.813 に答える