RESTfulなWebサービスで、主キーが他のもののコンポジットであるリソースに対してCRUD操作を実行するための通常の標準または習慣に関する情報を見つけることができない問題が発生しましたリソースID。 MVC WebApiを使用してコントローラを作成しています。複合キーリソースRESTサービス
Product
:PK =のProductIdPart
:PK = PartIdProductPartAssoc
:PK =(のProductId、PartId)
製品を持つことができ、多くの例では、3つのテーブルを持っています部品および部品は、多くの製品の構成要素となり得る。アソシエーションテーブルには、アソシエーション自体に関連する追加情報も編集可能な情報が含まれています。
私たちのように定義されたルートのテンプレートを使用して通常のGET/PUT/POST/DELETE操作ハンドルProductsController
とPartsController
のクラスがあります。次のIRIが動作することを{controller}/{id}/{action}
は、このような:
- GET、POST
/api/Products
は - すべての製品を返します、新製品 - GET、PUTを作成し、
/api/Products/1
DELETE - 、すべての部品を返し、新しい部分 を作成 - 取り出し/更新を/製品1
- GET、POST
/api/Parts
が削除 - GET、PUT、
/api/Parts/2
DELETE - 製品1 - のためのすべての部品が
/api/Parts/2/Products
をゲット - - パート2成分
されているすべての製品を得る取り出し/更新を/パート2
/api/Products/1/Parts
をGET削除ProductPartAssocリソースのルートテンプレートを定義する方法に問題があります。アソシエーションデータを取得するためにルートテンプレートとIRIの外観はどうでしょうか? 慣例を遵守、私が何か期待する:
- GET、POST
/api/ProductPartAssoc
は - 、すべての関連付けを返す関連 - GET、PUTを作成し、
/api/ProductPartAssoc/[1,2]
DELETE - 取り出し/更新を/製品1とパートの間の関連付けを削除します2
私の同僚は、しかし、これは審美的に不愉快見つけて、すべてでProductPartAssocController
クラスを持たない方が良いことだと思うのではなく、関連データを管理するためにProductsController
にメソッドを追加するように見える:
- GET、PUTは、
/api/Products/1/Parts/2
削除 - 従来、/Book/5/Chapter/3
のような他の実施例に基づく場合である部分1の部材としてのパート2の製品1及び2部ではなく、データ間の関連付けのためのデータを取得します私は他の場所で見たことがある。 - POSTここでIRIがどのように見えると思っているのかわかりません。残念ながら、彼らは意思決定者です。
私が求めているのは、私が指し示すことができる妥当性や方向性のいずれかであると私は推測しています。「これは他の人のことです。
コンポジットキーで識別されるリソースを処理する典型的な方法は何ですか?
エンティティをリンクする場合、Odataサービスに指定するODataプロトコルのように、uriスペースをモデル化できます。私はODataサービスを実装することを提案していませんが、有用な洞察を提供し、あなたの問題に近いので、それを検討する価値があります。エンティティ間のリンクを管理するにはこちらをご覧ください:http://www.odata。org/documentation/odata-v2-documentation/operations /#29_Manipulating_Links –
ProductPartAssocの外観は何ですか?そして、それがサポートしているCRUD操作は何ですか? –
この例は任意ですが、ProductPartAssocクラスは次のように見えます(ここでは簡潔に限られたスペースには申し訳ありません):class ProductPartAssoc {int ProductId; int PartId; int amountUsed; decimal assemblyCost; int installerId; } 4つのCRUD操作(Create、Retrieve、Update、Delete)をすべてサポートする必要があります。 – Mitselplik