Не удается выбрать между Task <IActionResult>, IActionResult и ActionResult <Thing> - PullRequest
0 голосов
/ 24 января 2019

Хотя я понимаю концепцию Task, ActionResult и т. Д., Я все еще не уверен, что было бы наиболее интуитивно понятно для ввода в контроллере, если ничего не указано.

Учитывая, что с возвращаемым типом все в порядке, я должен пойти так:

[HttpGet] public ActionResult<Thing> Get()
{
  return Ok(Context.Things);
}

Однако, если перейти к универсальному типу парадигмы API, я должен использовать это:

[HttpGet] public IActionResult Get()
{
  return Ok(Context.Things);
}

Наконец, учитывая асинхронную природу философии API, я должен применить следующее:

[HttpGet] public Task<IActionResult> Get()
{
  return Ok(Context.Things);
}

Я не могу выбрать между тем, который наиболее уместен в общем сценарии "зеленого поля". Первые две работы кажутся. Интуитивно я предпочел бы пойти с третьим, но так как он не работал (преобразование недействительно), я забеспокоился, что, возможно, я лаю неправильное двоичное дерево.

Не совсем уверен, как гуглить, и я получаю всевозможные примеры. Не знаю, как судить, какие из них актуальны, я предпочитаю спросить.

1 Ответ

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

Вот быстрое сравнение различных вариантов возврата:

Определенный тип

public Thing Get() {
    return Ok(Context.Things);
}

Это нормально, если действие всегда возвращает один возможный тип.Однако большинство действий могут возвращать исключения (т. Е. Коды состояния, отличные от 200), которые имеют разные типы.

Тип IActionResult

Это решает описанную выше проблему, поскольку тип возвращаемого значения IActionResult охватывает различные типы возвращаемых данных..

public IActionResult Get() {
    Thing thing = Context.Things;
    if (thing == null)
        return NotFound();
    else
        return Ok(thing);
}

Для асинхронного действия используйте Task<IActionResult>:

public async Task<IActionResult> Get() {
    Thing thing = await Context.Things;
    if (thing == null)
        return NotFound();
    else
        return Ok(thing);
}

Тип ActionResult

В ASP.NET Core 2.1 введен тип возврата ActionResult<T>, который предлагаетследующие преимущества по сравнению с типом IActionResult:

1 - ожидаемый тип возврата действия выводится из T в ActionResult<T>.Если вы украшаете свое действие атрибутом [ProducesResponseType], вам больше не нужно явно указывать его свойство Type.Например, вы можете просто использовать [ProducesResponseType(200)] вместо [ProducesResponseType(200, Type = typeof(Thing))].

2- T преобразует в ObjectResult, что означает, что return new ObjectResult(T); упрощается до return T;.

public ActionResult<Thing> Get() {
    Thing thing = Context.Things;
    if (thing == null)
        return NotFound();
    else
        return thing;
}

Для асинхронного действия используйте Task<ActionResult<T>>:

public async Task<ActionResult<Thing>> Get() {
    Thing thing = await Context.Things;
    if (thing == null)
        return NotFound();
    else
        return thing;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...