1

Person ---> Subject (1 to many) のようなサブジェクトのコレクションを持つ人のデザインがあります。

Id が 1 ( http://localhost/person/1) の人にアクセスすると、その人のすべての詳細とコレクションの詳細が表示されます。

個人のサブジェクトにアクセスするだけの URL を設計するにはどうすればよいですか? それはすべき http://localhost/person/1/subjectsですか?件名を追加するためにその URL に投稿できますか? 件名を更新するためにその URL にアクセスできますか?

個人のサブジェクトを処理するハンドラーはどれですか? Get と personid パラメーターを持つサブジェクト ハンドラーにするか、サブジェクトの戻りメソッドでサブジェクトのコレクションを返すパーソン ハンドラーにする必要がありますか?

4

2 に答える 2

1

ReST の観点からは、URI は単なる不透明な識別子であるため、URI がどのように構造化されているかは、まったく問題ではありません。

OR の観点からは、AtUri("/person/{id}/subjects/{subjectid}") を登録するだけで、Post(int id, int subjectid) の署名を使用してメソッドを作成できます。これはうまく機能します.

設計の観点から、独立してアクセスされるものはすべて別のリソースであるため、サブジェクトのコレクションと各サブジェクトは独立したリソースです。OR は、各独立したリソースを個別にマッピングすることに依存する多くの仮定を立てます。そうしないと、URI の作成などはすぐに壊れます。

于 2011-08-15T11:19:39.807 に答える
0

上記の場合、CreateUri拡張メソッドを使用してオブジェクトにハイパーメディアリンクを作成する必要がある場合は、親IDを子オブジェクトに追加する必要があります。

using System;
using System.Collections.Generic;
using OpenRasta.Codecs.Razor.TestApp.Codecs;
using OpenRasta.Configuration;
using OpenRasta.Web;

namespace OpenRasta.Codecs.Razor.TestApp
{
    public class Configuration : IConfigurationSource //, IDependencyResolverFactory
    {
    public void Configure()
    {
        using (OpenRastaConfiguration.Manual)
        {
            ResourceSpace.Has.ResourcesOfType<Person>()
                .AtUri("/person/{personId}")
                .HandledBy<PersonHandler>()
                .AsXmlDataContract();

            ResourceSpace.Has.ResourcesOfType<Subject>()
                .AtUri("/person/{personId}/subjects/{subjectId}")
                .HandledBy<SubjectHandler>()
                .AsXmlDataContract();
        }
    }
}

public class SubjectHandler
{
    public Subject Get(int personId, int subjectId)
    {
        var subject = new Subject()
                   {Name = string.Format("Person {0} Subject {1}", personId, subjectId), SubjectId = subjectId};  //PersonId = personId
        Uri link = subject.CreateUri();  //this line will fail unless Subject has personId property.
        subject.Link = link.AbsoluteUri;  
        return subject;
    }
}

public class Subject
{
    //public int PersonId {get; set;} //Need to add Parent link if using CreateUri() for OR to create link
    public int SubjectId { get; set; }
    public string Name { get; set; }
    public string Link { get; set; }
}

public class PersonHandler
{
    public Person Get(int personId)
    {
        return new Person() {Name = "Test" + personId, PersonId = personId};
    }
}

public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }
}

}

于 2011-10-27T15:45:02.420 に答える