ASP.NET Core API - ActionResult <T>против асинхронной задачи <T> - PullRequest
0 голосов
/ 30 января 2019

Если я создаю API с использованием .NET Core 2.1 с некоторыми типичными методами POST и GET, какой тип возвращаемого значения для этих методов является наиболее подходящим, ActionResult<T> или async Task<T>?Один из моих друзей использует последний в каждом создаваемом им API, и именно это использовала компания, в которой я работал, в то время как в учебнике по PluralSite используется первый.Я понимаю, что делает каждый из них, но я не уверен, какой из них должен быть реализован для любого данного HTTP-запроса?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

ASP.NET Core предлагает следующие параметры для типов возвращаемых действий контроллера Web API:

  • Specific type (T)
  • IActionResult
  • ActionResult<T>

Специальный тип (T):

Самое простое действие возвращает примитивный или сложный тип данных (например, строку или пользовательский тип объекта).Без известных условий для защиты во время выполнения действия может быть достаточно возврата определенного типа.Предыдущее действие не принимает параметров, поэтому проверка ограничений параметров не требуется.

Когда в действии необходимо учитывать известные условия, вводятся несколько путей возврата.В таком случае обычно смешивают тип возврата ActionResult с простым или сложным типом возврата.Либо IActionResult, либо ActionResult<T> необходимы для выполнения этого типа действия.

Тип IActionResult:

Тип возврата IActionResult подходит, если в возвращении возможно несколько типов возврата ActionResult.действие.Типы ActionResult представляют различные коды состояния HTTP.Некоторые распространенные типы возврата, попадающие в эту категорию: BadRequestResult (400), NotFoundResult (404) и OkObjectResult(200).

ActionResult<T> type:

ASP.NET Core 2.1 добавляет новые соглашения о программировании, которые облегчают создание чистых и описательных веб-API.ActionResult<T> - это новый тип, добавленный для того, чтобы приложение могло возвращать либо тип ответа, либо любой другой результат действия (аналогично IActionResult), в то же время указывая тип ответа.

ActionResult<T> более конкретно относится к веб-API в ASP.NET Core> = 2,1 и ActionResult<T> предлагает следующие преимущества по сравнению с типом IActionResult:

  • Свойство Type атрибута [ProducesResponseType] может быть исключено.Например, [ProducesResponseType(200, Type = typeof(Product))] упрощается до [ProducesResponseType(200)].Ожидаемый тип возврата действия вместо этого выводится из T in ActionResult<T>.
  • Неявные операторы приведения поддерживают преобразование как T, так и ActionResult в ActionResult<T>.T преобразуется в ObjectResult, что означает, что возврат нового ObjectResult(T); упрощен до return T;.

Для получения более подробной информации: Типы возвращаемых действий контроллера в ASP.NET Core Web API

0 голосов
/ 30 января 2019

Третье решение: задача 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

...