Я борюсь с двумя способами вернуть 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;
}