私は 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
};
}
これはうまくいきますが、これも私がやろうとしていることを達成するための最良の方法ではないと感じており、醜いメタデータページが次のように表示されます:
このデザインでは非常にシンプルなものを見落としているように感じます。誰かがデザインを合理化する方法を提案してくれれば、それは大歓迎です.
ありがとうございました。