sla*_*shp 2 c# rest web-services servicestack
我开始玩ServiceStack了,到目前为止我很享受它,但我认为我的设计从开始就有缺陷.基本上,我有一个MSSQL数据库,我通过NHibernate访问.由于我的请求/响应DTO和服务应采取什么结构,我的困惑即将到来.
我将我的NHibernate映射放在MyProject.Common.Models下的一个单独的项目中,它包含一个"Client"类,如下所示:
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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想为客户端提供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();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以看到的只是将我的模型类返回给客户端.通过这种设计,我完全不知道如何正确地发布新客户端,或者更新现有客户端.此外,如果我想返回所有客户端的列表,我目前正在使用以下请求/响应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();
}
}
Run Code Online (Sandbox Code Playgroud)
有这样的服务:
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
};
}
Run Code Online (Sandbox Code Playgroud)
哪个有效,虽然我觉得这也不是实现我想要做的最好的方法,并给了我一个丑陋的元数据页面显示如下:
我觉得这个设计很容易让我觉得很简单,如果有人能告诉我如何简化设计,我将非常感激.
谢谢.
您应该查看这些有助于使用ServiceStack进行API设计的早期帖子:
我不会重新哈希上面包含的任何内容,而是重写它我是如何做到的.
您不需要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; }
}
Run Code Online (Sandbox Code Playgroud)
基于上述请求DTO,服务实现应该是直截了当的.
使用上述API,您的C#客户端呼叫站点现在看起来像:
List<Client> clients = service.Get(new AllClients());
Client client = service.Get(new GetClient { Id = id });
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3845 次 |
最近记录: |