ASP. net Core API, возвращающий ActionResult <T>, тип возвращаемого значения не применяется - PullRequest
0 голосов
/ 05 августа 2020

Если API возвращает ActionResult<T>, не проводятся проверки компиляции или выполнения, чтобы гарантировать, что возвращаемый тип данных соответствует заявленному.

Например:

public ActionResult<Dog> GetCat()
{
    var cat = new Cat("Moggy");
    return Ok(cat);
}

Это компилирует, запускает и возвращает объект Cat.

Моя проблема заключается в том, что определение OpenAPI (Swagger / Swashbuckle) является производным от типа, объявленного в методе. Это означает, что определение OpenAPI может не синхронизироваться c с кодом, и нет очевидного способа найти эти экземпляры.

В приведенном примере моя документация API сообщала бы людям, что этот API возвращает Dog когда на самом деле он возвращает Cat.

Есть ли способ принудительно применить возвращаемый тип во время компиляции или сбой во время выполнения?

1 Ответ

2 голосов
/ 06 августа 2020

Это потому, что ваш возвращаемый тип OkObjectResult наследует ActionResult. Возвращенный дочерний класс не влияет на компиляцию родительского класса. Это сделано намеренно.

Более подробную информацию о двух классах вы можете найти в следующем исходном коде:

1. Ok метод возвращает тип OkObjectResult:

// Summary:
//     A base class for an MVC controller without view support.
[Controller]
public abstract class ControllerBase
{       
      // Summary:
    //     Creates an Microsoft.AspNetCore.Mvc.OkObjectResult object that produces an Microsoft.AspNetCore.Http.StatusCodes.Status200OK
    //     response.
    //
    // Parameters:
    //   value:
    //     The content value to format in the entity body.
    //
    // Returns:
    //     The created Microsoft.AspNetCore.Mvc.OkObjectResult for the response.
    [NonAction]
    public virtual OkObjectResult Ok([ActionResultObjectValueAttribute] object value);

2. OkObjectResult наследует ObjectResult:

    //
// Summary:
//     An Microsoft.AspNetCore.Mvc.ObjectResult that when executed performs content
//     negotiation, formats the entity body, and will produce a Microsoft.AspNetCore.Http.StatusCodes.Status200OK
//     response if negotiation and formatting succeed.
[DefaultStatusCode(200)]
public class OkObjectResult : ObjectResult
{
    //
    // Summary:
    //     Initializes a new instance of the Microsoft.AspNetCore.Mvc.OkObjectResult class.
    //
    // Parameters:
    //   value:
    //     The content to format into the entity body.
    public OkObjectResult(object value);
}

3. ObjectResult наследует ActionResult:

public class ObjectResult : ActionResult, IStatusCodeActionResult, IActionResult    
{
   public ObjectResult(object value);
   //..
}

Есть ли способ принудительно применить возвращаемый тип во время компиляции или в случае сбоя во время выполнения?

ActionResult<T> позволяет вам возвращать тип, производный from ActionResult или вернуть указанный c тип.

Чтобы принудительно выполнить ошибку компиляции, вы можете просто вернуть cat, который является определенным типом c. И вы можете увидеть, что сообщение об ошибке исчезает при изменении * От 1030 * до Cat:

public ActionResult<Dog> GetCat()
{
    var cat = new Cat("Moggy");
    return cat;
}

Результат:

enter image description here

введите описание изображения здесь

...