2013-08-21 13 views
7

Sto valutando come aggiungere collegamenti ipermediali alle risposte DTO. Anche se non esiste uno standard, aggiungere l'elenco alle DTO di risposta sembra essere il suggested approach.Link ipermediali con Servicestack nuova API

Conoscete qualche esempio o riferimento di implementazione utilizzando il framework ServiceStack?

Aggiungere la lista è ok per me, ma i miei dubbi riguardano dove mettere la logica dei seguenti collegamenti (all'interno del servizio o di una classe specializzata che contiene la macchina di stato?) E dove risolvere i percorsi (Un filtro?)

Grazie.

[Update] Da ServiceStack versione v3.9.62 è posible alla configurazione di accesso Routes via EndpointHost.Config.Metadata.Routes.RestPath, per cui la soluzione fornita da tgmdbm può essere migliorata withouth la necessità di "IRETURN + Routes attributi" , basta usare le informazioni di Metadata.Routes. Infatti, tutti i metadati del servizio possono essere interrogati e utilizzati per risolvere problemi. Rocce di Servicestack.

risposta

9

Il mio modo di fare questo al momento è che passo indietro una risposta dto che implementa un'interfaccia

Poi io uso un filtro di risposta per generare gli URL e popolare le intestazioni di risposta con i collegamenti.

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

Questo sembra il modo più pulito. L'oggetto Link dice in modo efficace "Se si effettua questa richiesta con questo metodo, si otterrà la risorsa denominata". L'unica cosa HTTP che sanguina fino alla BLL è Method. Ma potresti sbarazzartene e solo restituire gli URL. O mapparlo a qualche "operazione" generalizzata?

Per fare un esempio:

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

    // ... 
} 

(Il metodo AddPage restituisce un clone della richiesta e imposta la proprietà pagina in modo appropriato.)

Speranza che aiuta.

+0

Grazie, è una buona soluzione coerente con il framework Servicestack. In relazione a BLL, penso che il problema sia nella struttura stessa. Solo se avesse un accesso più aperto a Routes sarebbe più facile usare quella Mappa per effettuare il routing inverso, e potrebbe evitare tutto il codice di infrastruttura (attributi IReturn + Route) – jruizaranguren

+0

Sì, il metodo 'ToUrl' è dove la magia succede e, sfortunatamente, richiede la richiesta dto per implementare IReturn e avere l'attributo Route. – tgmdbm

Problemi correlati