ExpressJs条件路由的ServiceStack客户端路由

时间:2017-09-27 16:34:45

标签: c# express routing servicestack

ExpressJs允许您匹配条件(也称为动态或模糊)路线匹配。像GET '/people(/sex/:sexFilter)?(/age-over/:ageOverFilter)?'

这样的路线

符合以下示例:
/people
/people/sex/female
/people/sex/female/age-over/30
(最重要的是)/people/age-over/30

我想知道是否有一种配置ServiceStack(对于C#Xamarin应用程序)客户端的方法,如果请求dto对象属性保留为null,则会生成以下路由:< / p>

HttpService.Instance.Get<Person[]>(new SearchPeopleRoute() { sexFilter = "female" });
// Generates /people/sex/female

HttpService.Instance.Get<Person[]>(new SearchPeopleRoute() { ageOverFilter = 30 });
// Generates /people/age-over/30

解决方案需要可扩展到许多搜索过滤器,因此对于过滤器的每个排列都具有[Route(...)]属性是不可维护的。

我不知道在通话之前是否有办法在运行时生成路线,但这很棒。

1 个答案:

答案 0 :(得分:1)

在ServiceStack中,您需要列出您希望能够使用该服务调用的不同路由,例如:

[Route("/people")]
[Route("/people/sex/{Sex}")]
[Route("/people/sex/{Sex}/age-over/{AgeOver}")]
public class SearchPeopleRoute
{
     public string Sex { get; set; }
     public int? AgeOver { get; set; }
}

然后,C#/。NET服务客户端根据填充请求DTO的内容选择最合适的路由。

对于ServiceStack中的查询,我们鼓励您使用?queryString来应用任何更适合设计HTTP API的过滤器,因为/path/info用于标识资源{{1} }用于将修饰符应用于该资源请求。

此约定为embraced in AutoQuery,允许您定义请求DTO,如:

?queryString

无需实现实现,您可以查询implicit conventions [Route("/people")] public class SearchPeople : QueryDb<Person> {} 表上的任何字段,其中上述AutoQuery请求DTO自动支持以下查询:

Person