servicestack使用RouteAttribute在AppHost VS装饰器中注册路由

7wp*_*7wp 2 asp.net servicestack

我想知道ServiceStack注册路由的最佳做法是什么.

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

我已经阅读了一些在AppHost中这样做的地方,因为它将路线定义与DTO分离.但我看到的大多数例子都是使用装饰器模式.

哪个更好?是否有任何争论使用一个而不是另一个?

kam*_*psj 5

使用路线属性装饰您的DTO已成为最佳做法.SerivceStack的"新API"的发布表明了这一点的许多好处,但最重要的是它促进了更"简洁,类型化,端到端的客户端API".

通过使用路由属性除了与的一个标记您的DTO的IReturn,IReturn<T>或者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
Run Code Online (Sandbox Code Playgroud)

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

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

脱钩怎么样? 我认为没有必要将DTO与路线分离.我希望我的开发人员知道在不改变路线的情况下不应更改请求.我看到了很多运行时错误,因为我忘了在更改DTO后更新AppHost中的路由.