我做的方式是目前我傳回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
方法返回所述請求的克隆,並適當地設置頁屬性。)
希望有所幫助。
謝謝,這是一個與Servicestack框架一致的良好解決方案。關於BLL,我認爲問題出在框架本身。就好像它對路由有更多的開放訪問權限,使用該映射進行反向路由會更容易,並且它可能會避免所有的基礎結構代碼(IReturn + Route屬性) – jruizaranguren
是的,ToUrl方法是魔術的地方發生並且不幸的是,它需要請求dto實施IReturn並具有Route屬性。 – tgmdbm