2013-04-17 162 views
2

我開始嘗試使用ServiceStack,到目前爲止我都很喜歡它,但我認爲我的設計有缺陷。基本上,我有一個MSSQL數據庫,我通過NHibernate訪問。由於我的請求/響應DTOs &服務應該採用什麼結構,我的困惑正在出現。ServiceStack REST API設計

我有一個單獨的項目我的NHibernate的映射下MyProject.Common.Models其中包含了「客戶」類像這樣:

namespace MyProject.Common.Models 
{ 
    public class Client 
    { 
     public virtual int ClientID { get; set; } 
     public virtual string Name { get; set; } 
     public virtual string Acronym { get; set; } 
     public virtual string Website { get; set; } 
    } 

    public class ClientMap : ClassMap<Client> 
    { 
     public ClientMap() 
     { 
      Id(x => x.ClientID, "ClientID").GeneratedBy.Identity(); 

      Map(x => x.Name, "Name"); 
      Map(x => x.Acronym, "Acronym"); 
      Map(x => x.Website, "Website"); 
     } 
    } 
} 

我想提供客戶端CRUD單個客戶端的能力,以及顯示所有客戶的列表。到目前爲止,我設計我的一個客戶端的請求,像這樣:

[Route("/clients/{Id}", "GET")] 
public class ClientRequest : IReturn<ClientResponse> 
{ 
    public string Id { get; set; } 
} 

public class ClientResponse : IHasResponseStatus 
{ 
    public MyProject.Common.Models.Client Client { get; set; } 
    public ResponseStatus ResponseStatus { get; set; } 

    public ClientResponse() 
    { 
     this.ResponseStatus = new ResponseStatus(); 
    } 
} 

正如你所看到的只是我的模型類返回給客戶端。通過這種設計,我完全不知道如何正確發佈新客戶端或更新現有客戶端。另外,如果我想回到所有客戶的名單,我目前使用下面的請求/響應的DTO:

[Route("/clients", "GET")] 
public class ClientsRequest : IReturn<ClientsResponse> 
{ 

} 
public class ClientsResponse : IHasResponseStatus 
{ 
    public List<MyProject.Common.Models.Client> Clients { get; set; } 
    public ResponseStatus ResponseStatus { get; set; } 

    public ClientsResponse() 
    { 
     this.ResponseStatus = new ResponseStatus(); 
    } 
} 

與服務,像這樣:

public ClientsResponse Get(ClientsRequest request) 
{ 
    var result = currentSession.Query<Chronologic.Eve.Common.Models.Client>().ToList(); 

    if (result == null) 
     throw new HttpError(HttpStatusCode.NotFound, new ArgumentException("No clients exist")); 

    return new ClientsResponse 
    { 
     Clients = result 
    }; 
} 

其中一期工程,雖然我覺得這樣也沒有達到我所試圖做的最好的辦法,並給了我一個醜陋的元數據頁面顯示如下所示:

Ugly ServiceStack metadata

我覺得我忽略了這個設計很簡單,如果有人可以告訴我如何簡化設計,將不勝感激。

謝謝。

回答

6

你應該看看這些早期的帖子,這將有助於與API設計ServiceStack:

而不是重新哈希任何內容包含上面,我會重寫它,我會怎麼做。

您不需要ResponseStatus屬性,以便您的服務可以返回乾淨的DTO。

[Route("/clients", "GET")] 
public class AllClients : IReturn<List<Client>> {} 

[Route("/clients/{Id}", "GET")] 
public class GetClient : IReturn<Client> 
{ 
    public string Id { get; set; } 
} 

基於上述請求DTO,服務實現應該是直截了當的。

通過上述API,您的C#客戶端調用的地方現在看起來像:

List<Client> clients = service.Get(new AllClients()); 

Client client = service.Get(new GetClient { Id = id }); 
+0

非常感謝傑米斯!自從去年初我在上次玩SS時,我覺得這是完全不同的方式。 – slashp

+0

是的,[新的API](https://github.com/ServiceStack/ServiceStack/wiki/New-Api)允許更多的自由,這總是很好:) – mythz