2016-09-03 1 views
0

私はサードパーティ製品用のAsp.Net Web APIを構築しており、APIとしてOData 4を使用することを検討しています。私はオブジェクトモデルでかなりの自由度を持っていますが、基礎となるデータモデルを変更することはできません。odata APIを作成するときに複雑な関係を処理する方法は?

odataはリレーションシップを定義するナビゲーションプロパティをサポートしていますが、オブジェクト間の直接リンクのように見えます。私が構築しているデータモデルの多くの場合、関係には独自の特性があります。たとえば、 'User'にはグループ、組織単位などとの 'Member Of'関係のコレクションがあり、 'Member Of'リンク自体には 'Is Default'ブール値プロパティがあります。場合によっては、リレーションシップに複数のプロパティがあります。

これを処理する最善の方法はありますか?プロパティを持つ 'メンバーシップ'エンティティを作成し、ナビゲーションプロパティを持つユーザ(ユーザ>メンバーシップ>グループ)から2つのホップを持つ必要がありますか?私は 'Membership'複合型を作成する必要があります、 'Membership'のコレクションである 'Memberships'プロパティを作成し、 'Membership'(もし可能なら)にNavigation Propertyを持っていますか?これらのオプションのいずれかを使用すると、便宜のためにグループのすべてのメンバーに読み取り専用のナビゲーションプロパティを追加する必要があります(ユーザー>グループ)。 RESTの観点から

おかげ

答えて

0

は(Richardson Maturity Model level 3を参照)、一度userリソースにナビゲートし、クライアントがgroup-query関係(リンク)を発見することができます。ここでは、これがHAL Browserようなツールになります方法は次のとおりです。

"api:group-query": { 
    "href": "http://apiname:port/api/group?userId=1,pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}" 
}, 

これは、ユーザーがメンバーであるgroup資源の(ページング)コレクションに消費者を取る:

GET /api/user/1/groups

{ 
    "groups": [ 
     { 
     "id": 123, 
     "name": "Test Group" 
     }, 
     { 
     "id": 134, 
     "name": "Tennis squad" 
     } 
    ] 
} 

membershipリソース/エンティティは必要ありませんリンクを統合する場合はyです

+0

ありがとうアレクサンドル。私の質問は、ユーザーとグループの間のリンクがプロパティを持っているところですが、私はあなたの答えが解決しないと考えています。 – AndrewS

+0

[Target Attributes](https://tools.ietf.org/html/rfc5988#section-5.4)に関するWeb Linkingの仕様を見ると、あなたは[extend](https:// tools。 ietf.org/html/rfc5988#section-6.3)をアプリケーション固有のデータで置き換えます。 –

関連する問題