web-dev-qa-db-ja.com

ASP.NET Core API-ActionResult <T>とasync Task <T>

いくつかの一般的なPOSTおよびGETメソッドで.NET Core 2.1を使用してAPIを作成している場合、これらのメソッドの戻り値の型が最も適しています。ActionResult<T>またはasync Task<T>?私の友人の1人は、彼が作成するすべてのAPIで後者を使用しています。これは、私が配置に使用していた会社で使用されたものですが、PluralSiteのチュートリアルでは前者を使用しています。それぞれが何をしているのかは理解していますが、特定のHTTPリクエストに対してどちらを実装する必要があるのか​​わかりません。

8
Calum Mullen

ASP.NET Coreは、Web APIコントローラーアクションの戻り値の型に対して次のオプションを提供します。

  • Specific type (T)
  • IActionResult
  • _ActionResult<T>_

特定のタイプ(T):

Specific戻り型は、異なる戻り型の可能性をさらにチェックせずにプリミティブまたは複合データ型を返す必要がある場合に適しています(BadRequestResult(400)_,_ NotFoundResult(404)_, and_ OkObjectResult(200 ) `。)次のアクションから:

_[HttpGet]
public async Task<List<Product>> GetProducts()
{
    return await _repository.GetProductsAsync();

    // Here you can not return Ok(products), NotFound() etc;
    // If you need to return NotFound() etc then use `IActionResult` instead of Specific type.
}
_

IActionResultタイプ:

IActionResult戻り型は、次のようにアクションで複数のActionResult戻り型が可能な場合に適しています。

_[HttpGet]
public async Task<IActionResult> GetProductById(int id)
{
    Product product = await _repository.GetProductByIdAsync(id);

    if(product == null)
    {
        return NotFound(); // Here is one return type
    }

    return Ok(product);  // Here is another return type
}
_

ActionResultタイプは、さまざまなHTTPステータスコードを表します。このカテゴリに分類される一般的な戻り値の型は、BadRequestResult (400)NotFoundResult (404)、およびOkObjectResult(200)です。

_ActionResult<T>_タイプ:

ASP.NET Core 2.1は、クリーンで記述的なWeb APIの構築を容易にする新しいプログラミング規則を追加します。 _ActionResult<T>_は、アプリが応答タイプまたはその他のアクション結果(IActionResult)、応答タイプを示します。

_ActionResult<T>_ASP.NET Core> = 2.1および_ActionResult<T>_は、IActionResultタイプよりも次の利点があります。

  • _[ProducesResponseType]_属性のTypeプロパティは除外できます。たとえば、[ProducesResponseType(200, Type = typeof(Product))][ProducesResponseType(200)]に簡略化されます。アクションの期待される戻り値の型は、代わりに_ActionResult<T>_のTから推測されます。
  • 暗黙のキャスト演算子は、TActionResultの両方の_ActionResult<T>_への変換をサポートしています。 TObjectResultに変換されます。つまり、新しい値を返すObjectResult(T);は_return T;_に簡略化されます。

詳細: ASP.NET Core Web APIのコントローラーアクションの戻り値の型

10
TanvirArjel

3番目のソリューション:IActionResultタスク、次のようなもの:

[HttpGet]
[ProducesResponseType(typeof(IList<Currency>), 200)]
public async Task<IActionResult> GetAll()
{
    return Ok(await _typeService.GetCurrenciesAsync().ConfigureAwait(false));
}

[HttpGet("{id}", Name = "GetCurrency")]
[ProducesResponseType(typeof(Currency), 200)]
public async Task<IActionResult> Get([FromRoute]int id)
{
    return Ok(await _expenseService.GetCurrencyAsync(id).ConfigureAwait(false));
}

Microsoftの例と、代わりにインターフェイスを返す理由をご覧ください。 IActionResult

8
PmanAce