1

私はリソースコレクションを持つOkNegotiatedContentResult<T>を返すApiControllerを持っています。当然ながら、ページ付けされたコレクションを返すメソッドが増えます。IHttpActionResultを返すための余分なメソッドを提供する方法?

これらすべての行動の結果でcontentはおおよそ次のようになります。

  • 現在の項目
  • Dataプロパティなど総ページ数と総アイテム
  • としてページングメタデータプロパティPagingMeta最初の/前/次/最後のページへのリンクを含むPagingLinksのプロパティ

私のバックエンドrカスタムのPagedList<T>オブジェクトがあり、上記のプロパティを含む別のPagedListResponse<T>があります。それは、一方から他方への単純な変換です。

今、ウェブAPIで、ApiControllerのような、IHttpActionResultを返すための便利な方法をいくつか提供しています。私はそれと同じようにするために期待していた

  • Ok<T>(T value)
  • Content<T>(HttpStatusCode statusCode, T value)

コントローラーが簡単にページされた結果を返すのは簡単です。私は次のシグネチャで、それを提供して拡張メソッドを持っている瞬間のために

public static OkNegotiatedContentResult<PagedListResult<T>> OkPaged<T>(this ApiController controller, /* other parameters */) 

「醜い」はあなただけthisキーワードを含むことにより、拡張メソッドを呼び出すことができるということです。

return this.OkPaged(myResult); 

私が見ることができる唯一の他の選択肢は、基本コントローラクラスを実装することですが、一般的には後で道に迷う傾向があるため、このような継承構造を避けようとします。

ASP.NETは、私がやりたいことをするために拡張ポイントの点で何を提供していますか?

答えて

0

あなたは常に例えば

public class HttpStatusCodeResultWithContent<T> : IHttpActionResult 
{ 
    private readonly HttpRequestMessage httpRequestMessage; 

    private readonly HttpStatusCode statusCode; 

    public HttpStatusCodeResultWithContent(HttpRequestMessage httpRequestMessage, HttpStatusCode statusCode, T model) 
    { 
     this.httpRequestMessage = httpRequestMessage; 
     this.statusCode = statusCode; 
     ResponseModel = model; 
    } 

    public T ResponseModel { get; private set; } 

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken) 
    { 
     var response = httpRequestMessage.CreateResponse(statusCode, ResponseModel); 
     return Task.FromResult(response); 
    } 
} 

、IHttpActionResultから継承するクラスを作成し、戻り値としてそれを使用することができ、あなたが任意のHTTP持つ任意のコンテンツを返すことができますHttpStatusCodeResultWithContentで簡単にテスト可能なクラスを与えることステータスコード。あなたが好きなら

次に、あなたのコントローラのコード、

var pagedListResult = someObject.GetPagedList(); 
return new HttpStatusCodeResultWithContent<PagedListResult<T>(Request, HttpStatusCode.OK, pagedListResult); 

からあなたは、このへのアクセスをラップするApiControllerに拡張メソッドを使用することができます - それはすべてのことは、例えば、ApiController内部で起こっているほとんどですApiControllerの 'Ok'メソッドは次のようになります。

protected internal virtual OkNegotiatedContentResult<T> Ok<T>(T content) 
{ 
    return new OkNegotiatedContentResult<T>(content, this); 
} 
関連する問題