我做的方式是目前我传回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