C# 带有Servicestack新API的超媒体链接
我正在评估如何将超媒体链接添加到DTO响应。虽然没有标准,但将列表添加到响应DTO似乎是最好的选择 您知道使用ServiceStack框架实现的任何示例或参考吗 添加列表对我来说是可以的,但我的疑问是:将以下链接的逻辑放在哪里(在服务或保存状态机的专用类中?),以及在哪里解析路由(过滤器?) 谢谢 [Update]从ServiceStack v3.9.62版开始,可以通过EndpointHost.Config.Metadata.Routes.RestPath访问路由配置,因此可以改进提供的解决方案,而无需“IReturn+路由属性”,只需使用Metadata.Routes信息。C# 带有Servicestack新API的超媒体链接,c#,rest,servicestack,C#,Rest,servicestack,我正在评估如何将超媒体链接添加到DTO响应。虽然没有标准,但将列表添加到响应DTO似乎是最好的选择 您知道使用ServiceStack框架实现的任何示例或参考吗 添加列表对我来说是可以的,但我的疑问是:将以下链接的逻辑放在哪里(在服务或保存状态机的专用类中?),以及在哪里解析路由(过滤器?) 谢谢 [Update]从ServiceStack v3.9.62版开始,可以通过EndpointHost.Config.Metadata.Routes.RestPath访问路由配置,因此可以改进提供的解决方
事实上,所有服务元数据都可以查询并用于跨领域关注点。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; }
// ...
}