2

刚刚学习 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请求。例如,我想接收(并更改)具有特定UserID 的所有订单。

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

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

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

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

它是一种 RESFull 的做事方式吗?它如何在 ServiceStack 中实现?您能否提供一个小代码示例(甚至是示意图)如何做到这一点?

4

1 回答 1

3

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

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

由于{ID}URL 指的是用户 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>
  • 因为OrderOrderService : RestServiceBase<Order>

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

public class OrderService : RestServiceBase<Order>
{
    public override object OnGet(Order request)
    {
        // ...
    }
}
于 2012-12-23T16:07:25.403 回答