2013-08-21 93 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