2011-08-12 10 views
1

Iは、(多くの人にとって1) 人--->件名などの科目のコレクションを有する者OpenRastaは

のデザインを持っています すべての人の詳細とコレクションの詳細が表示されます。

人物の件名にアクセスするためのURLをどのように設計すればよいですか? http://localhost/person/1/subjectsにする必要がありますか? そのURLに投稿して件名を追加できますか? そのURLに件名を更新することはできますか?

人の科目を扱うハンドラは何ですか? Getとpersonidパラメータを持つサブジェクトハンドラか、サブジェクトの返却メソッドを持つサブジェクトのコレクションを返す 人ハンドラですか?

答えて

1

ReSTの観点からは、URIは単なる不透明な識別子なので、構造がどのように構成されているかは直交性の問題です。

ORの観点からは、AtUri( "/ person/{subject}/subjects/{subjectid}")を登録し、メソッドがPost(int id、int subjectid)という署名を持つことができます。うまく動作します。

独立してアクセスするものはすべてリソースなので、サブジェクトと各サブジェクトのコレクションは独立したリソースです。 ORは独立した各リソースを個別にマッピングすることに頼っている多くの仮定をしています。そうしないと、URI作成のようなことがすぐに中断します。

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; } 
} 

}

関連する問題