OpenRasta доступ к подэлементам

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

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

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

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

2 ответа

Решение

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

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

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

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

}

Другие вопросы по тегам