2011-08-12 63 views
1

我已经有喜欢的人 --->主题对象的集合(1对多)OpenRasta访问子元素

一个人的设计,如果我访问的人与1的ID(http://localhost/person/1) 它会显示所有人的详细信息和收集详细信息。

如何设计一个URL来访问该人的主题? 是否应该是 http://localhost/person/1/subjects? 我可以发布到该URL以添加主题吗? 我可以通过该URL更新主题吗?

什么处理程序应该处理一个人的主题? 它应该是一个带有Get和Personid参数的主题处理程序吗?或者是一个 人员处理程序用主题的返回方法返回主题集合?

回答

1

从ReST的角度来看,丝毫不重要,URI只是不透明的标识符,所以它们的结构是一个正交关系。

从OR的角度来看,您可以注册AtUri(“/ person/{id}/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; } 
} 

}