2012-12-23 34 views
2

刚学REST和ServiceStack并要求建议如何构建这个示例模式:建议REST /服务设计收集“DTO”响应/请求

我有一个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的所有订单。

例如User ID = 2具有10 OrderID的集合。所以我尽管可以像这样构建一个URI:/ MyHost/2/Orders,它会返回Order对象的集合。

我已经尝试添加其他DTO对象Order,绑定路线是这样的:

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

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

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

回答

3

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

随着ServiceStack我通常更喜欢定义请求和响应的类,其中,请求类将具有所有可能的输入参数,并响应定义生成的对象。虽然在例子中这些往往可以像User那样组合。

由于URL中的{ID}指的是用户ID,所以最好命名为{UserID},并且在请求类中也有这个属性。

也许你可以有用户ID的Order类:

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的用户ID映射到您的用户名和属性,你可以用它来查询数据库等

每个请求类通常与您的应用程序逻辑对应于另一个服务类。因此,

  • 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) 
    { 
     // ... 
    } 
} 
+0

但我怎么可以检测(在功能'获取(用户UserRequest)')如果URL为/用户/ 123或/ user/123 /订单??? – Jasper

+0

编辑回答添加更多信息。基本上/ User/123和/ User/123/Orders应该由两个diff处理。服务。一个返回用户,另一个返回订单。他们恰好分享了部分url路径。对于订单,会有另一种方法(在另一个类中)'Get(Order orderRequest)'。 – AlexD