我喜欢ASP.NET MVC控制器的功能,能够添加将URL的某个部分映射到方法参数的路由属性,即:
[Route("there/are/{howManyDucks}/swimming/in/the/{bodyOfWaterType}")]
public string NotifyDucksSwimming(int howManyDucks, string bodyOfWaterType)
{
...
}
是否有相同的方法使用ServiceStack执行此操作并跳过为每种类型的请求创建DTO类?
答案 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等。
因此,上面的自定义路线将允许您通过以下方式致电服务:
此外,如果此API仅用于在Razor页面内执行,在大多数情况下您根本不需要服务,因为ServiceStack允许您call the Razor Pages directly with its No Ceremony Pages feature。