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; }
}
}