Создание исключений отдыха в моих службах приложений против добавления дополнительной логики к контроллеру, чтобы определить, нужно ли мне отвечать 404 - PullRequest
0 голосов
/ 07 июня 2018

Я борюсь с двумя способами вернуть HttpStatusCode.NotFound (и другие коды статуса Http).

1.) Моя служба приложения выдаст RestException(HttpStatusCode code), который перехватывается Middleware, а затем правильный ответотправляется обратно и код ответа установлен.Например, если у меня есть [Httpget]GetEmployeeById(int Id) и Id не является реальным идентификатором сотрудника, ответьте 404.

2.) В моем контроллере вызов службы приложений к GetByEmployee() может вернуть ноль, если это так, яreturn NotFound(), который делает то же самое, что и промежуточное программное обеспечение.Но вместо этого это делается в контроллере, и служба приложений по-прежнему не знает о кодах состояния http.

RestException Pros:

  • Разреживающие контроллеры.
  • Менее сложный код.Если у меня есть действие с именем PutEmployee(Employee employeeToUpdate), мне больше не нужно писать дополнительную логику для выборки, чтобы определить, существует ли она, обойти отслеживаемые объекты и т. Д. Служба приложений обрабатывает все это.

Возвращение кодов в контроллере Плюсы:

  • Поскольку я использую ActionResult, и я либо возвращаю Employee или NotFound(), мне не нужно [ProducesResponseType(typeof(FluentValidationDataTableFieldError), StatusCodes.Status400BadRequest))], потому что это может бытьВывод.
  • Http / API / Rest вещи остаются на своем месте, в контроллере.

По сути, это разница между следующими фрагментами:

[HttpPost("", Name = EmployeeControllerRoute.PostEmployee)]
[ProducesResponseType(typeof(EmployeeCreateUpdateJsonModel), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(SpecialErrorViewModel), StatusCodes.Status400BadRequest)]
public async Task<EmployeePageJsonViewModel> Post([FromBody]EmployeeCreateUpdateJsonModel employeeToAdd)
    => await _employeeService.AddAsync(employeeToAdd); // AddAsync throws `RestException(HttpStatusCode code)` if `employeeToAdd.Id` does not pull up a real item.

VS

[HttpGet("{productIds}", Name = ProductControllerRoute.GetProducts)]
public async Task<ActionResult<List<ProductViewModel>>> Get(EntityIdList productIds)
{
    var products = await _productService.GetMultipleByIdAsync(productIds);

    if(products.Count != productIds.Count)
    {
        return NotFound();
    }

    return products;
}
...