2012-12-23 61 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