2013-08-21 59 views
7

我正在评估如何将超媒体链接添加到DTO响应。尽管没有标准,但将List添加到响应DTO似乎是suggested approach与Servicestack新API的超媒体链接

您是否知道使用ServiceStack框架的实现的任何示例或参考?我的怀疑是关于在哪里放置以下链接的逻辑(在服务或保存状态机的专用类中?)以及在哪里解析路由(过滤器? )

谢谢。

[更新]从ServiceStack版本v3.9.62可以通过EndpointHost.Config.Metadata.Routes.RestPath访问路由配置,因此可以在不需要“IReturn +路由属性”的情况下改进tgmdbm提供的解决方案, ,只是使用Metadata.Routes信息。事实上,所有服务元数据都可以被查询并用于交叉顾虑。 Servicestack岩石。

回答

9

我做的方式是目前我传回DTO它实现的接口

然后我用一个响应滤波器生成的网址,并与链接填充响应头的响应。

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

这似乎是最干净的方式。上面的Link对象有效地说:“如果你用这种方法提出这个请求,你将得到指定的资源”。流血到BLL的唯一HTTP事件是Method。但你可以摆脱这一点,只能通过GET网址。或将其映射到一些广义的“操作”?

作为一个例子:

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

    // ... 
} 

(该AddPage方法返回所述请求的克隆,并适当地设置页属性。)

希望有所帮助。

+0

谢谢,这是一个与Servicestack框架一致的良好解决方案。关于BLL,我认为问题出在框架本身。就好像它对路由有更多的开放访问权限,使用该映射进行反向路由会更容易,并且它可能会避免所有的基础结构代码(IReturn + Route属性) – jruizaranguren

+0

是的,ToUrl方法是魔术的地方发生并且不幸的是,它需要请求dto实施IReturn并具有Route属性。 – tgmdbm