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 只是不透明的标识符,因此它们的结构是一个正交的问题。

从 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 回答