2013-04-17 4 views
2

Je commence à jouer avec ServiceStack et j'en profite jusqu'à présent mais je pense que mon design est défectueux dès le départ. Essentiellement, j'ai une base de données MSSQL à laquelle j'accède via NHibernate. Ma confusion vient à cause de exactement quelle structure mes demandes/réponses DTO & devraient prendre.ServiceStack REST API Design

J'ai ma cartographie NHibernate dans un projet distinct sous MyProject.Common.Models qui contient une classe « Client » comme ceci:

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"); 
     } 
    } 
} 

Je veux fournir au client la possibilité de Crud un seul client, ainsi que l'affichage d'une liste de tous les clients. Jusqu'à présent, je l'ai conçu ma seule demande client comme ceci:

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

qui, comme vous pouvez le voir est tout simplement retourner ma classe de modèle au client. Avec ce genre de conception, je suis complètement à la perte de la façon de POSTER correctement un nouveau client, ou mettre à jour un client existant. De plus, si je voulais retourner une liste de tous les clients, j'utilise actuellement la demande suivante/réponse 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(); 
    } 
} 

Avec un service comme si:

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 
    }; 
} 

Ce qui fonctionne, bien que je se sentir comme cela est pas non plus la meilleure façon d'obtenir ce que je tente de faire, et me donne une page indiquant les métadonnées laids comme ceci:

Ugly ServiceStack metadata

Je me sens comme Je suis assez simple avec ce design, et si quelqu'un pouvait me suggérer comment rationaliser le design, il serait grandement apprécié.

Merci.

Répondre

6

Vous devriez vérifier ces postes précédents qui vous aideront à la conception de l'API avec ServiceStack:

Plutôt que de re-hachage tout contenu ci-dessus, je vais juste réécrire comment je le ferais.

Vous n'avez pas besoin d'une propriété ResponseStatus pour que vos services puissent renvoyer des objets DTO propres. L'implémentation du service doit être directe en fonction des DTO de demande ci-dessus.

Avec l'API ci-dessus, votre C# les sites d'appel client ressemblent maintenant:

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

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

Merci beaucoup Demis! Je pense que c'est une façon complètement différente de faire cela depuis la dernière fois que j'ai joué avec les SS au début de l'année dernière. – slashp

+0

Oui, la [Nouvelle API] (https://github.com/ServiceStack/ServiceStack/wiki/New-Api) a permis beaucoup plus de liberté, ce qui est toujours bien :) – mythz