2011-08-12 3 views
1

나는 (많은 1) 사람 ---> 주제 같은 주제의 컬렉션을 갖는 사람OpenRasta는

의 디자인을 가지고 모든 사람의 세부 정보와 컬렉션 세부 정보가 표시됩니다.

사람의 과목에 액세스하기위한 URL을 어떻게 디자인합니까? http://localhost/person/1/subjects일까요? 주제를 추가하려면 해당 URL에 게시 할 수 있습니까? 해당 URL을 사용하여 제목을 업데이트 할 수 있습니까?

사람의 과목을 처리해야하는 처리기는 무엇입니까? Get 및 personid 매개 변수를 사용하는 주체 처리기 또는 주체 처리기에서 주체 집합을 반환하고 주체를 반환하는 메서드 여야합니까?

답변

1

ReST 관점에서 보면 URI는 단지 불투명 식별자 일 뿐이므로 URI가 단순한 불투명 식별자이므로 구조화 방법이 직각 문제입니다.

OR 관점에서 볼 때 AtUri ("/ person/{id}/subjects/{subjectid}")를 등록하고 Post (int id, int subjectid)의 서명을 가진 메소드를 가질 수 있습니다. 잘 될거야.

디자인 관점에서 볼 때, 독립적으로 액세스 할 수있는 것은 또 다른 리소스이므로, 주제 및 각 주제의 수집은 독립적 인 리소스입니다. OR은 각각의 독립적 인 자원을 독립적으로 매핑하는 데 의존하는 많은 가정을 만듭니다. 그렇지 않으면 URI 작성과 같은 작업이 빠르게 중단됩니다.

0

위의 경우 CreateUri 확장 메서드를 사용하여 개체에 하이퍼 미디어 링크를 만들어야 할 경우 부모 개체를 자식 개체에 추가해야합니다.

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

}