2016-04-07 2 views
3

Я довольно новичок в ServiceStack, и я стараюсь выяснить, как лучше всего работать с несколькими операциями получения по одному и тому же запросу. Ниже мой запрос объект:Работа с несколькими операциями получения

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

Как вы можете видеть, что я имею в обработку первых два маршрута "/ Entity" и "/ Entity/{Id}" со стороны обслуживания. Как лучше всего обработать маршрут «/ Entity/{Id]/Child»? В текущем состоянии третий URL-адрес возвращает все объекты. Любая помощь будет оценена?

Спасибо!

ответ

4

Посмотрите на эти существующие ответы ниже, которые проходят через рекомендуемый способ разработки услуг с ServiceStack:

Рекомендация должна иметь другая служба, если ответ отличается. Ваши услуги должны быть самостоятельной описательный, а не полагаться на документаций в Notes для описания каждой службы (что читать очень мало людей), так что я бы перепроектировать свои услуги в нечто вроде:

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

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

Если бы Кроме того, как ваша служба, чтобы быть в состоянии предоставить возможность запрашивать объекты имеют вид на AutoQuery который позволяет создать полностью запрашиваемую RDBMS спинок службы с только Запросом DTO ниже:

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

остальных услуги похожи отдельный запрос DTO для каждого другого типа Сервиса, где DTO запроса будет содержать al л свойства, необходимые для вызова, что службы, например:

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

Проектирование вашей службы таким образом, что делает его явным, что делает каждая служба, параметры каждой службы планирующим и что он возвращает. Это также находит свое отражение при вызове вышеуказанных услуг с ServiceStack's Typed Service Clients, например:

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

Мое личное предпочтение использовать явное Response DTO для каждой службы, как это подтверждает выгодность услуг и позволяет впоследствии эволюционировать службу вернуть дополнительные результаты позже, не нарушая существующих Сервисных Клиентов, но если вы предпочитаете, вы можете вместо этого возвращать результаты напрямую без явной обертки Отклика DTO, например:

Смежные вопросы