我可以为每个请求使用带有方法参数的ServiceStack路由而不是DTO类吗?

时间:2016-05-01 02:01:35

标签: c# servicestack

我喜欢ASP.NET MVC控制器的功能,能够添加将URL的某个部分映射到方法参数的路由属性,即:

[Route("there/are/{howManyDucks}/swimming/in/the/{bodyOfWaterType}")]
public string NotifyDucksSwimming(int howManyDucks, string bodyOfWaterType)
{
 ...
}

是否有相同的方法使用ServiceStack执行此操作并跳过为每种类型的请求创建DTO类?

1 个答案:

答案 0 :(得分:7)

ServiceStack's message-based design中的一个基本概念是,所有服务都接受请求DTO,这是define your Service Contract所使用的。几乎所有ServiceStack的周边功能生态系统都是可能的,因为您的服务合同是在单独的clean, impl and dependency-free DTO's中定义的,这与您的服务合同与服务器方法实现相关联的RPC Services Design WCF, MVC and Web API encourage相反。

ServiceStack中的等价物将是:

//Request DTO

[Route("/there/are/{HowManyDucks}/swimming/in/the/{BodyOfWaterType}")]
public class NotifyDucksSwimming 
{
    public int HowManyDucks { get; set; }
    public string BodyOfWaterType { get; set; }
}

//Implementation

public object Any(NotifyDucksSwimming request)
{
    //...
}

然而,填充/path/info中的所有属性并不是很好的API设计,因此我建议您在下面查看以下这些答案,以获取一些API设计示例:

所以我选择了一个代表资源的API端点,可能是:

[Route("/ducks/{BodyOfWaterType}")]
public class NotifyDucksSwimming 
{
    public int HowManyDucks { get; set; }
    public string BodyOfWaterType { get; set; }
}

在ServiceStack中,您只需指定/path/{info},因为所有其他参数都可以通过任何其他方式自动填充,例如:QueryString,FormData,Serialized Body,HTTP Param Header Overrides等。

因此,上面的自定义路线将允许您通过以下方式致电服务:

  • /鸭子/湖泊?HowManyDucks = 10

没有仪式剃刀观点

此外,如果此API仅用于在Razor页面内执行,在大多数情况下您根本不需要服务,因为ServiceStack允许您call the Razor Pages directly with its No Ceremony Pages feature