我现在开始使用ServiceStack,到目前为止我很喜欢它,但是我认为我的设计从一开始就存在缺陷。 本质上,我有一个要通过NHibernate访问的MSSQL数据库。 由于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");
        }
    }
}

我想为客户端提供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
    };
}

哪个可行,尽管我觉得这也不是实现我要尝试的最佳方法,并且给了我一个丑陋的元数据页面,如下所示:

丑陋的ServiceStack元数据

我觉得我对这种设计的看法非常简单,如果有人可以建议我如何简化设计,将不胜感激。

谢谢。

===============>>#1 票数:6 已采纳

您应该查看以下较早的帖子,这将有助于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; }
}

服务实现应基于上述“请求DTO”而直接进行。

使用上述API,您的C#客户端调用网站现在看起来像:

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

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

  ask by slashp translate from so

未解决问题?本站智能推荐: