servicestack使用RouteAttribute在AppHost VS decorator中注册路由



我想知道ServiceStack注册路由的最佳实践是什么。

  1. 使用routes.Add-in-AppHost定义路由
  2. 使用DTO上的RouteAttiribute装饰器定义路由

我读过一些在AppHost中这样做更可取的地方,因为它将路由定义与DTO分离。但我看到的大多数示例都使用decorator模式。

那么,哪一个更好呢?有什么论点可以用其中一个来代替另一个吗?

用路由属性装饰DTO已成为最佳实践。SeriveStack的"新API"的发布表明了它的许多好处,但最重要的是,它促进了一个更"简洁、类型化、端到端的客户端API"。

除了使用IReturnIReturn<T>IReturnVoid接口之一标记DTO外,还可以使用Route属性,从而使用ServiceStack现在提供的全部功能。

优点

  • 您可以仅基于DTO来动态发现使用端点的url
  • 您的消费服务客户端代码(如果是c#)变得更加强类型,并且更改现有路由/DTO变得微不足道
  • 保持AppHost干净纤薄。我相信AppHost中的代码越少越好
  • 代码可以变得更易于测试
  • 在AppHost中添加路由的同时工作(您不必只选择一个)
  • 最棒的是,这一切都很有效

对于给定的DTO,您可以使用ToUrl扩展方法通过发现属性来获取生成路由。

[Route("/route/{Id}/{Name}")]
public class ExampleDTO : IReturn
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}
var url = new ExampleDTO() { Id = 1, Name = "Test", Value = "Foo" }.ToUrl("GET"); 
// generates  /route/1/Test?value=Foo

ServiceClients将在幕后完成所有这些工作。您的消费代码可以变成:

ExampleDTO response  = new JsonServiceClient(“http://api.com/)
   .Get(new ExampleDTO() { Id = 1, Name = "Test", Value = "Foo" });

脱钩怎么办我认为,没有太大的必要将DTO与Routes脱钩。我想让我的开发人员同事知道,如果不更改路由,就不应该更改请求。我看到了很多运行时错误,因为我在更改DTO后忘记了更新AppHost中的路由。

最新更新