2013-08-21 6 views
7

Я оцениваю, как добавить гипермедиа ссылки на ответы DTO. Несмотря на отсутствие стандарта, добавьте список в ответные коды DTO, как представляется, suggested approach.Ссылки Hypermedia с Servicestack new API

Вы знаете какой-либо пример или ссылку на реализацию с использованием инфраструктуры ServiceStack?

Добавление списка подходит для меня, но мои сомнения касаются того, где поставить логику следующих ссылок (внутри службы или специализированного класса, который содержит конечный автомат?) И где разрешать маршруты (фильтр?)

Спасибо.

[Обновление] Из ServiceStack версии v3.9.62 это Возможное конфигурации маршрутов доступа через EndpointHost.Config.Metadata.Routes.RestPath, поэтому решение обеспечивается tgmdbm может быть улучшена withouth необходимости «IReturn + Маршруты атрибутов» , просто используя информацию Metadata.Routes. Фактически все метаданные службы могут быть запрошены и использованы для сквозных задач. Служебные скалы.

ответ

9

Как я сделать это в настоящее время я прохожу обратно ответ DTO, который реализует интерфейс

Затем я использую фильтр ответа для создания URL-адресов и заполнить заголовки ответа со ссылками.

this.ResponseFilters.Add((req, res, dto) => 
{ 
    if (!(dto is IHaveLinks)) 
    return; 

    var links = (dto as IHaveLinks).Links 

    if(links == null || !links.Any()) 
    return; 

    var linksText = links 
    .Select(x => string.Format("<{0}>; rel={1}"), x.Request.ToUrl(x.Method), x.Name)); 

    var linkHeader = string.Join(", ", linksText); 

    res.AddHeader("Link", linkHeader); 
}); 

Это кажется самым чистым способом. В приведенном выше объекте Link говорится: «Если вы сделаете этот запрос с помощью этого метода, вы вернете именованный ресурс». Единственная вещь HTTP, которая истекает до BLL, равна Method. Но вы можете избавиться от этого и только пройти обратно GET URL. Или сопоставить его с некоторой обобщенной «операцией»?

В качестве примера:

public class ExampleService : Service 
{ 
    public ExamplesResponse Get(ExamplesRequest request) 
    { 
    var page = request.Page; 
    var data = // get data; 

    return new ExamplesResponse 
     { 
     Examples = data, 
     Links = new [] 
      { 
      new Link { Name = "next", Request = request.AddPage(1), Method = "GET" }, 
      new Link { Name = "previous", Request = request.AddPage(-1), Method = "GET" }, 
      } 
     } 
    } 
} 

[Route("/examples/{Page}")] 
public class ExamplesRequest : IReturn<ExamplesResponse> 
{ 
    public int Page { get; set; } 

    // ... 
} 

(Метод AddPage возвращает клон запроса и устанавливает свойство страницы надлежащим образом.)

Надежда, что помогает.

+0

Спасибо, это хорошее решение, совместимое с каркасом Servicestack. Что касается BLL, я думаю, проблема в самой структуре. Просто, если у него был более открытый доступ к Маршрутам, было бы проще использовать эту карту, чтобы сделать обратную маршрутизацию, и она может избежать всего этого кода инфраструктуры (атрибуты IReturn + Route) – jruizaranguren

+0

Да, метод ToUrl - это то, где волшебство происходит и, к сожалению, требует запроса dto для реализации IReturn и атрибута Route. – tgmdbm

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