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

Bra*_*don 2 c# servicestack

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

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

是否有一种与ServiceStack相同的方法,并为每种类型的请求跳过DTO类?

myt*_*thz 7

这是ServiceStack基于消息的设计中的一个基本概念,即所有服务都接受请求DTO,这是用于定义服务合同的内容.几乎所有ServiceStack的周边功能生态系统都是可能的,因为您的服务合同是在一个单独的干净,impl和无依赖DTO中定义的,这与DMA服务设计WCF,MVC和Web API相反,鼓励您的服务合同与您的服务器耦合方法实现.

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)
{
    //...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

  • /鸭子/湖泊?HowManyDucks = 10

没有仪式剃刀意见

此外,如果此API仅用于在Razor页面中执行,在大多数情况下您根本不需要服务,因为ServiceStack允许您直接使用其无仪式页面功能调用Razor页面.