建议在'DTO'响应/请求中收集REST /服务设计

时间:2012-12-23 14:58:09

标签: c# rest servicestack

只是学习REST和ServiceStack并询问如何构建此示例模式的建议:

我有一个User对象包含这些字段:

public class User
{
   public string ID {get;set;
   public string Name {get;set;}
   public List<int> OrderID {get;set;}     // inner collection
   //  all other fields
 }

我有一个Service课程:

public class UserService : Service
{
   public List<User> Get(User UserRequest)
   {
      List<User> lstUsers = // Somehow polulate a collection of Users
      return  lstUsers;
   }

   // Other functions
 }

和AppHost文件(暂时自托管)

 public UserHost : AppHostHttpListenerBase
 {
     public override void Configure(Funq.Container container)
     {
            Routes
               .Add<User>("/UserInfo")
               .Add<User>("/User/{ID}");
      }
  }

一切正常:客户端(浏览器)发送一个空的“用户”请求并接收User个对象的集合,但我需要添加的是获取特定的User请求。例如,我想接收(并更改)具有特定User ID的所有订单。

例如,ID = 2的User的集合为10 OrderID。所以我虽然可以构建这样的URI:/ MyHost / 2 / Orders,它将返回Order个对象的集合。

我已经尝试添加另一个DTO对象Order并将其绑定到这样的路由:

  Route.Add<Order>("/User/{ID}/Oders")

但它不起作用。屏幕(至少在浏览器中)始终保持空白,似乎没有来自SS的响应。

这是一种RESFull的做事方式吗?如何在ServiceStack中实现?你能提供一些代码示例(甚至原理图)如何做到这一点?

1 个答案:

答案 0 :(得分:3)

如果要返回给定用户的订单列表,那么绑定到URL "/User/{ID}/Orders"是RESTful方式,是的。

使用ServiceStack,我通常更喜欢定义请求和响应类,其中请求类将具有所有可能的输入参数,响应定义结果对象。虽然这些内容通常可以像示例中的User那样组合。

由于网址中的{ID}是指用户ID,因此最好将其命名为{UserID},并在您的请求类中使用此属性。

您可以在Order类上使用UserID:

public class Order
{
    public string ID { get; set; } // order ID
    public string UserID { get; set; } // user ID - also request param
    // ...
}

Routes.Add<Order>("/User/{UserID}/Oders");

现在,来自URL的UserID被映射到您的UserID属性,您可以使用它来查询数据库等。

每个请求类通常对应于具有应用逻辑的另一个服务类。因此,

  • User您有UserService : RestServiceBase<User>
  • {li> for OrderOrderService : RestServiceBase<Order>

当ServiceStack看到此URL映射Routes.Add<Order>("/User/{UserID}/Oders")时,它知道为给定的URL调用OrderService

public class OrderService : RestServiceBase<Order>
{
    public override object OnGet(Order request)
    {
        // ...
    }
}