我开始使用 ServiceStack,到目前为止我很享受它,但我认为我的设计从一开始就有缺陷。本质上,我有一个通过 NHibernate 访问的 MSSQL 数据库。我的困惑是由于我的请求/响应 DTO 和服务应该采用什么结构。
我在 MyProject.Common.Models 下的一个单独项目中有我的 NHibernate 映射,其中包含一个“客户端”类,如下所示:
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
};
}
哪个有效,尽管我觉得这也不是实现我想要做的事情的最佳方式,并且给了我一个丑陋的元数据页面,如下所示:
我觉得我忽略了这个设计非常简单,如果有人可以向我建议如何简化设计,我将不胜感激。
谢谢你。