2016-04-07 13 views
3

私はかなり新しいServiceStackです。同じ要求に対して複数のget操作を処理するためのベストプラクティスを理解しようとしています。以下は、私のリクエストオブジェクトです:複数のget操作の処理

[Route("/Entity", Verbs = "GET", Notes = "Returns all the entities.")] 
[Route("/Entity/{Id}", Verbs = "GET", Notes = "Returns a specific entity.")] 
[Route("/Entity/{Id}/Child", Verbs = "GET", Notes = "Returns children of a specific entity.")]  
public class EntityRequest { 
    public int Id { get; set; } 
    public int ChildId { get; set; } 
} 

そして、以下は私のサービスです。

public object Get(EntityRequest request) { 
     if (request.Id > 0) { 
      //returns a given entity 
      return _applicationService.getEntities(request.Id); 
     } 

     //How do I handle this? Check for the word "/Child" in the URL? 
     //returns children for a given entity 
     //return _applicationService.getChildren(request.Id); 

     //returns all the entities 
     return _applicationService.getEntities(); 
    } 
} 

あなたは、私が「/エンティティ」最初の二つの経路を処理し、「/エンティティ/ {ID}」しています見ることができるようにサービス側から。どのようにして "/ Entity/{Id}/Child"ルートを処理するのが最適でしょうか?現在の状態では、3番目のURLはすべてのエンティティを返します。どんな助けにも感謝しますか?

ありがとうございます!

答えて

4

はServiceStackでサービスを設計するために推奨される方法を通過し、その下、これらの既存の回答を見てください:

勧告をすることです応答が異なる場合は別のサービス。あなたのサービスもむしろ、(非常に少数の人々が読んで)各サービスを記述するためにNotesのドキュメンテーションに頼るよりも、自己記述する必要がありますので、私のような何かにあなたのサービスを再設計します:

[Route("/entities")] 
public class GetAllEntities : IReturn<GetAllEntitiesResponse> {} 

public class GetAllEntitiesResponse 
{ 
    public List<Entity> Results { get; set; } 
} 

あなたが希望の場合

[Route("/entities/search")] 
public class QueryEntities : QueryBase<Entity> {} 

残りのサービスは類似しています。また、あなただけのリクエスト下記のDTOと完全に-照会可能RDBMS担保サービスを作成することができますAutoQueryを見て、エンティティを照会する機能を提供することができるように、あなたのサービスが好きリクエストDTOが含まれる異なるタイプのサービスごとに別々のリクエストDTO lのサービス、例えばことを呼び出すために必要なプロパティ:子エンティティのための同様

[Route("/entities/{Id}")] 
public class GetEntity : IReturn<GetEntityResponse> 
{ 
    public int Id { get; set; } 
} 

public class GetEntityResponse 
{ 
    public Entity Result { get; set; } 
} 

サービス:あなたのサービスの設計

[Route("/entities/{Id}/children")] 
public class GetEntityChildren : IReturn<GetEntityChildrenResponse> 
{ 
    public int Id { get; set; } 
} 

public class GetEntityChildrenResponse 
{ 
    public List<EntityChild> Results { get; set; } 
} 

この方法は、各サービスが何をするか、それが明示的に作るのパラメータは、各サービスが期待するとのそれは何を返します。

var response = client.Get(new GetAllEntities()); 
var response = client.Get(new GetEntity { Id = 1 }); 
var response = client.Get(new GetEntityChildren { Id = 1 }); 

私の個人的な好みが将来の証明として、各サービスのためのサービスを、明示的なレスポンスDTOを使用することで、後で追加の結果を返すようにサービスを進化させることができます:例えば、ServiceStack's Typed Service Clientsで上記のサービスを呼び出すときにも反映されます後で既存のサービスクライアントを破ることなく、明示的なResponse DTOラッパーなしで結果を直接返すことができます。たとえば、

[Route("/entities")] 
public class GetAllEntities : IReturn<List<Entity>> {} 

[Route("/entities/{Id}")] 
public class GetEntity : IReturn<Entity> 
{ 
    public int Id { get; set; } 
} 

[Route("/entities/{Id}/children")] 
public class GetEntityChildren : IReturn<List<EntityChild>> 
{ 
    public int Id { get; set; } 
} 
関連する問題