OpenRasta访问子元素

时间:2011-08-12 13:12:23

标签: rest openrasta

我有一个人的设计,有一系列科目 人--->主题(1对多)

如果我访问ID为1(http://localhost/person/1)的人, 它将显示所有人的详细信息和收集细节。

如何设计网址以仅访问此人的主题? 应该是吗? http://localhost/person/1/subjects? 我可以发布到该URL以添加主题吗? 我可以使用该URL更新主题吗?

什么处理程序应该处理一个人的主题? 它应该是具有Get和personid参数的主题处理程序还是 人员处理程序使用主题的返回方法返回主题集合?

2 个答案:

答案 0 :(得分:1)

从ReST的角度来看,最重要的是,URI只是不透明的标识符,因此它们的结构是一个正交的问题。

从OR的角度来看,你可以只注册AtUri(“/ person / {id} / subjects / {subjectid}”)并让你的方法签名为Post(int id,int subjectid),工作很好。

现在从设计的角度来看,任何独立访问的内容都是另一个资源,因此主题和每个主题的集合都是独立的资源。 OR做了很多假设,依赖于你独立地映射每个独立资源,否则像URI创建这样的东西会很快崩溃。

答案 1 :(得分: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; }
}

}