2

私は 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();
    }
}

ご覧のとおり、モデル クラスをクライアントに返すだけです。この種の設計では、新しいクライアントを適切に POST したり、既存のクライアントを更新したりする方法を完全に失っています。また、すべてのクライアントのリストを返したい場合は、現在、次の要求/応答 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 メタデータ

このデザインでは非常にシンプルなものを見落としているように感じます。誰かがデザインを合理化する方法を提案してくれれば、それは大歓迎です.

ありがとうございました。

4

1 に答える 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 });
于 2013-04-17T23:13:47.487 に答える