【问题标题】:OpenRasta accessing sub elementsOpenRasta 访问子元素
【发布时间】:2011-10-25 19:35:56
【问题描述】:

我设计了一个拥有一系列主题的人,例如 人 ---> 主题(1 到多个)

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

我如何设计一个 URL 来访问这个人的主题? 应该是 http://localhost/person/1/subjects? 我可以发布到该 URL 以添加主题吗? 我可以输入那个 URL 来更新主题吗?

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

【问题讨论】:

    标签: rest openrasta


    【解决方案1】:

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

    从 OR 的角度来看,您只需注册 AtUri("/person/{id}/subjects/{subjectid}") 并让您的方法带有 Post(int id, int subjectid) 的签名,这将工作得很好。

    现在从设计的角度来看,任何要独立访问的东西都是另一个资源,所以主题的集合和每个主题都是独立的资源。 OR 做出很多假设,依赖于您独立映射每个独立资源,否则 URI 创建之类的事情会很快中断。

    【讨论】:

      【解决方案2】:

      在上述情况下,如果您需要使用 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; }
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-17
        • 2012-05-01
        • 2012-02-08
        • 1970-01-01
        • 2018-12-09
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        相关资源
        最近更新 更多