2013-08-21 5 views
7

Ich überlege, wie Hypermedia-Links zu DTO-Antworten hinzugefügt werden. Obwohl es keinen Standard gibt, fügen Sie der Antwort DTOs List hinzu, die suggested approach zu sein scheint.Hypermedia-Links mit Servicestack neue API

Kennen Sie ein Beispiel oder eine Referenz der Implementierung mit ServiceStack-Framework?

Hinzufügen Liste ist in Ordnung für mich, aber meine Zweifel sind darüber, wo die Logik der folgenden Links (Innerhalb des Dienstes oder einer spezialisierten Klasse, die die State Machine hält?) Und wo die Routen (ein Filter?)

Danke.

[Update] Ab ServiceStack Version v3.9.62 ist es möglich, über EndpointHost.Config.Metadata.Routes.RestPath auf Routes-Konfiguration zuzugreifen, so dass die von tgmdbm bereitgestellte Lösung verbessert werden kann, ohne "IReturn + Routes-Attribute" zu benötigen. , nur mit Metadata.Routes Informationen. In der Tat können alle Service-Metadaten abgefragt und zu Querschnittsfragen verwendet werden. Servicestack rockt.

Antwort

9

So wie ich dies derzeit tun, ist ich wieder eine Antwort übergeben dto welcher eine Schnittstelle implementiert

Dann habe ich eine Antwort Filter verwenden, um die URLs zu erzeugen und die Antwort-Header mit den Links zu füllen.

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

Dies scheint der sauberste Weg. Das obige Objekt Link sagt effektiv "Wenn Sie diese Anfrage mit dieser Methode machen, erhalten Sie die benannte Ressource zurück". Die einzige HTTP-Sache, die bis zum BLL blutet, ist Method. Aber Sie könnten das loswerden und GET-URLs nur zurückgeben. Oder ordnen Sie es einer generalisierten "Operation" zu?

Als Beispiel:

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

    // ... 
} 

(Die AddPage Methode gibt einen Klon des Antrags und legt die Eigenschaft Seite entsprechend.)

Hoffnung, das hilft.

+0

Vielen Dank, es ist eine gute Lösung im Einklang mit Servicestack-Framework. In Bezug auf BLL denke ich, dass das Problem im Framework selbst liegt. Nur wenn es einen offeneren Zugang zu Routes hätte, wäre es einfacher, diese Map zu verwenden, um das umgekehrte Routing zu machen, und es könnte den ganzen Infrastrukturcode vermeiden (IReturn + Route-Attribute) – jruizaranguren

+0

Ja, die 'ToUrl'-Methode ist die Magie passiert und erfordert leider die Anfrage dto, um IReturn zu implementieren und das Route-Attribut zu haben. – tgmdbm