我開始嘗試使用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
};
}
其中一期工程,雖然我覺得這樣也沒有達到我所試圖做的最好的辦法,並給了我一個醜陋的元數據頁面顯示如下所示:
我覺得我忽略了這個設計很簡單,如果有人可以告訴我如何簡化設計,將不勝感激。
謝謝。
非常感謝傑米斯!自從去年初我在上次玩SS時,我覺得這是完全不同的方式。 – slashp
是的,[新的API](https://github.com/ServiceStack/ServiceStack/wiki/New-Api)允許更多的自由,這總是很好:) – mythz