【问题标题】:Suggest REST/Service design for collection in 'DTO' response/request建议在“DTO”响应/请求中收集 REST/服务设计
【发布时间】:2012-12-23 14:58:09
【问题描述】:

刚刚学习 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 中实现?您能否提供一个小代码示例(甚至是示意图)如何做到这一点?

【问题讨论】:

    标签: c# rest servicestack


    【解决方案1】:

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

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

    由于 URL 中的 {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&lt;User&gt;,
    • Order 有OrderService : RestServiceBase&lt;Order&gt;。

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

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

    【讨论】:

    • 但是如果 URL 是 /User/123 或 /User/123/Orders,我如何检测(在函数 Get(User UserRequest) 中)???
    • 编辑答案以添加更多信息。基本上 /User/123 和 /User/123/Orders 应该由两个 diff 处理。服务。一个返回用户,另一个返回订单。他们只是碰巧共享了部分 url 路径。对于订单,将有另一种方法(在另一个类中)Get(Order orderRequest)。
    猜你喜欢
    • 2023-03-10
    • 2013-04-02
    • 1970-01-01
    • 2014-11-18
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多