2013-08-21 5 views
7

私はハイパーメディアリンクをDTOレスポンスに追加する方法を評価しています。標準はありませんが、応答DTOにListを追加すると、suggested approachと思われます。ハイパーメディアはServicestackの新しいAPIとのリンク

ServiceStackフレームワークを使用して実装の例や参照を知っていますか?

リストを追加するのは大丈夫ですが、私の疑問は次のリンク(サービス内かステートマシンを保持する特殊なクラス内)のロジックをどこに置くのかということです。 )

ありがとうございます。

tgmdbmによって提供される溶液は必要withouth向上させることができるので、それは、EndpointHost.Config.Metadata.Routes.RestPath介してアクセス経路の設定にかのうであるServiceStackバージョンv3.9.62から[更新]「IReturn +ルート属性」 Metadata.Routes情報を使用するだけです。 実際、すべてのサービスメタデータを照会してクロスカッティングの懸案事項に使用することができます。サービスマンの岩。

答えて

9

私はこれを行う方法は、現在、私はその後、私はURLを生成し、リンクを持つレスポンスヘッダを設定するために、応答フィルタを使用するインターフェイス

を実装するDTO応答を返すためです。

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オブジェクトは、「このメソッドでこのリクエストを行うと、指定されたリソースを取り戻す」と効果的に言います。 BLLまで出血する唯一のHTTPのものは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」メソッドは、残念なことに、IReturnを実装し、Route属性を持つ要求dtoが必要です。 – tgmdbm

関連する問題