вернуть DTO из контроллера WebAPI - PullRequest
0 голосов
/ 08 сентября 2018

К сожалению, не удалось найти ни одного сообщения, посвященного этому аспекту.

Я создал приложение WebAPI (ASP.NET Core 2.1) и использую NSwag , который я использую для автоматической генерации прокси-серверов службы машинописи.

Я видел примеры кода, где JsonResult & ActionResult возвращается действием контроллера.

DTO обычно относятся к Service Layer , поэтому мне интересно, можно ли использовать их в качестве вывода действия контроллера.

Интересно, правильно ли возвращать DTO из действия контроллера.

Контроллер

[Route("api/[controller]/[action]")]
[Authorize]
public class EntryController : ControllerBase
{
    private readonly IEntryService _entryService;

    public EntryController(
        IEntryService entryService
        )
    {
        _entryService = entryService;
    }

    public async Task<List<EntryDto>> GetMany(long id)
    {
        var result = await _entryService.GetMany(id);
        return result;
    }
}

Услуги

public class EntryService : BaseService, IEntryService
{
    private readonly IEntryHighPerformanceService _entryHighPerformanceService;

    public EntryService(
        AppDbContext context,
        IEntryHighPerformanceService entryHighPerformanceService,
        SessionProvider sessionProvider
        ) : base(
              context,
              sessionProvider
              )
    {
        _entryHighPerformanceService = entryHighPerformanceService;
    }

    public async Task<List<EntryDto>> GetMany(long id)
    {
        var dtos = _entryHighPerformanceService.GetByVocabularyId(id);
        return await Task.FromResult(dtos);
    }
}

1 Ответ

0 голосов
/ 08 сентября 2018

Ссылка Типы возвращаемых действий контроллера в ASP.NET Core Web API

ActionResult<T> тип

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

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

Например, ваш контроллер

[HttpGet]
public async Task<ActionResult<List<EntryDto>>> GetMany(long id) {
    //lets say we wanted to validate id
    if(id < 1) {
        return BadRequest("id must be greater than zero (0)");
    }

    var result = await _entryService.GetMany(id);
    if(result == null || result.Count == 0) {
        return NotFound(); // returns proper response code instead of null
    }
    return result;
}
...