ASP.net Web API の背後には、コード ファーストのエンティティ フレームワーク モデルがあります。次の (簡略化された) エンティティを検討してください。
public class Form
{
public long Id { get; set; }
public string Identifier { get; set; }
public virtual FormGroup Group { get; set; }
}
public class FormGroup
{
public long Id { get; set; }
public string Identifier { get; set; }
public virtual ICollection<Form> Forms { get; set; }
}
ご覧のとおり、FormGroups と Forms の間には 1 対多の関係があります。私の質問は、フォームが属するグループを変更できる RESTful API をどのように設計すればよいですか?
これまでのところ、それぞれに長所と短所がある 2 つの潜在的なアプローチを考え出しました。
関係をリンク構造として表す:
{
"Id" : 1,
"Identifier" : "Form1",
"link" : {
"rel": "http://myapi/res/formgroup",
"href": "http://myapi/formgroups/1"
}
}
長所:
- フォームグループ表現への意味のあるリンクが含まれています
短所:
- そのようなリンクには特定の基準はありません
- サーバー側のロジックがより複雑になる
PUT を使用してリソースをリンクする
data: {
"Id" : 1,
"Identifier" : "Form1"
}
PUT data to http://myapi/formgroups/1/forms
長所:
- 表現に余分なプロパティはありません
短所:
- リソースは、複数の URI (/forms/1 と /formgroups/1/forms/1 など) で識別できます。
- キーを形成するために必要なデータ以外のデータを送信することは、無関係であるか、混乱を招きます。
これらのアプローチには、それぞれ長所よりも短所があるように見えるため、特に満足しているとは言えません。
「適切な」解決策は、DTO を実装し、リソース表現からエンティティ モデルを分離することです。これにより、設定できる FormGroupId を追加できます。
すべての優れたプログラマーと同様に、RESTful API でこれがどのように機能するかを知りたいと思っています。また、モデル内の任意のナビゲーション プロパティに一般的に適用できるソリューションも必要です。
はがきの回答...これらのアプローチのいずれかが有効ですか、それとも私が見逃した別の方法がありますか?
ピート