OpenRasta доступ к подэлементам - PullRequest
1 голос
/ 12 августа 2011

У меня есть дизайн человека, у которого есть коллекция предметов, таких как Человек ---> Предмет (от 1 до многих)

Если я получаю доступ к человеку с Id 1 (http://localhost/person/1),покажет все данные о человеке и сведения о коллекции.

Как мне создать URL для простого доступа к предметам для человека?Это должно быть http://localhost/person/1/subjects?Могу ли я опубликовать на этот URL, чтобы добавить темы?Могу ли я указать этот URL для обновления тем?

Какой обработчик должен обрабатывать темы человека?Должен ли это быть субъектный обработчик с Get и параметром personid или личный обработчик, возвращающий коллекцию предметов с методом возврата предметов?

Ответы [ 2 ]

1 голос
/ 15 августа 2011

С точки зрения ReST это ни в коем случае не имеет значения, URI - это просто непрозрачные идентификаторы, поэтому их структура - это вопрос ортогональности.

С точки зрения ИЛИ, вы можете просто зарегистрировать AtUri.("/ person / {id} / subject / {subjectid}") и ваш метод с подписью Post (int id, int subjectid), который будет работать просто отлично.

Теперь с точки зрения дизайнавсе, что должно быть доступно независимо, является другим ресурсом, поэтому набор предметов и каждый предмет являются независимыми ресурсами.ИЛИ делает много предположений, полагаясь на то, что вы сопоставляете каждый независимый ресурс независимо, иначе такие вещи, как создание URI, быстро прерываются.

0 голосов
/ 27 октября 2011

В приведенном выше случае, если вам нужно использовать метод расширения 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; }
}

}

...