2

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

  1. 在 AppHost 中使用 Routes.Add 定义路由
  2. 使用 DTO 上的 RouteAttiribute 装饰器定义路由

我已经阅读了一些在 AppHost 中执行此操作更可取的地方,因为它将路由定义与 DTO 分离。但是我看到的大多数例子都是使用装饰器模式。

那么哪个更好呢?有什么论据可以使用其中一个吗?

4

1 回答 1

5

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

IReturn除了使用、IReturn<T>或接口之一标记您的 DTO 之外,通过使用 Route 属性,IReturnVoid您可以使用 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 与路由分离。我希望我的开发人员知道,如果不更改路由,则不应更改请求。我见过很多运行时错误,因为我在更改 DTO 后忘记更新 AppHost 中的路由。

于 2013-08-02T13:32:29.700 回答