servicestack,C#,Rest,servicestack" /> servicestack,C#,Rest,servicestack" />

C# 带有Servicestack新API的超媒体链接

C# 带有Servicestack新API的超媒体链接,c#,rest,servicestack,C#,Rest,servicestack,我正在评估如何将超媒体链接添加到DTO响应。虽然没有标准,但将列表添加到响应DTO似乎是最好的选择 您知道使用ServiceStack框架实现的任何示例或参考吗 添加列表对我来说是可以的,但我的疑问是:将以下链接的逻辑放在哪里(在服务或保存状态机的专用类中?),以及在哪里解析路由(过滤器?) 谢谢 [Update]从ServiceStack v3.9.62版开始,可以通过EndpointHost.Config.Metadata.Routes.RestPath访问路由配置,因此可以改进提供的解决方

我正在评估如何将超媒体链接添加到DTO响应。虽然没有标准,但将列表添加到响应DTO似乎是最好的选择

您知道使用ServiceStack框架实现的任何示例或参考吗

添加列表对我来说是可以的,但我的疑问是:将以下链接的逻辑放在哪里(在服务或保存状态机的专用类中?),以及在哪里解析路由(过滤器?)

谢谢

[Update]从ServiceStack v3.9.62版开始,可以通过EndpointHost.Config.Metadata.Routes.RestPath访问路由配置,因此可以改进提供的解决方案,而无需“IReturn+路由属性”,只需使用Metadata.Routes信息。
事实上,所有服务元数据都可以查询并用于跨领域关注点。Servicestack rocks。

目前我这样做的方式是将响应dto传回,该dto实现了一个接口

public interface IHaveLinks
{
  [IgnoreDataMember]
  IEnumerable<Link> Links { get; }
}

public class Link
{
  public string Name { get; set; }
  public IReturn Request { get; set; }
  public string Method { get; set; }
}
(AddPage方法返回请求的克隆,并适当设置页面属性。)


希望能有所帮助。

谢谢,这是一个与Servicestack框架一致的好解决方案。关于BLL,我认为问题在于框架本身。如果它对路由有一个更开放的访问权限,那么使用该映射进行反向路由将更容易,而且它可能会避免所有的基础结构代码(IReturn+路由属性)。是的,
ToUrl
方法就是魔法发生的地方,不幸的是,它需要请求dto来实现IReturn并拥有路由属性。
this.ResponseFilters.Add((req, res, dto) =>
{
  if (!(dto is IHaveLinks))
    return;

  var links = (dto as IHaveLinks).Links

  if(links == null || !links.Any())
    return;

  var linksText = links
    .Select(x => string.Format("<{0}>; rel={1}"), x.Request.ToUrl(x.Method), x.Name));

  var linkHeader = string.Join(", ", linksText);

  res.AddHeader("Link", linkHeader);
});
public class ExampleService : Service
{
  public ExamplesResponse Get(ExamplesRequest request)
  {
    var page = request.Page;
    var data = // get data;

    return new ExamplesResponse
      {
        Examples = data,
        Links = new []
          {
            new Link { Name = "next", Request = request.AddPage(1), Method = "GET" },
            new Link { Name = "previous", Request = request.AddPage(-1), Method = "GET" },
          }
      }
  }
}

[Route("/examples/{Page}")]
public class ExamplesRequest : IReturn<ExamplesResponse>
{
  public int Page { get; set; }

  // ...
}