在我的应用程序服务中抛出休息异常与向控制器添加额外逻辑以确定是否需要使用404进行回复

时间:2018-06-07 18:42:43

标签: c# restful-architecture onion-architecture

我正在努力使用两种方法来返回HttpStatusCode.NotFound(和其他Http状态代码)。

1。)我的应用服务将抛出一个RestException(HttpStatusCode code),它被中间件捕获,然后发回一个正确的响应并设置响应代码。例如,如果我有[Httpget]GetEmployeeById(int Id)且Id不是真正的员工ID,请回复404。

2.。)在我的控制器中,对GetByEmployee()的Application Service调用可能返回null,如果是,我return NotFound()与中间件相同。但相反,这是在控制器中完成的,应用程序服务仍然不知道http状态代码。

RestException优点:

  • 较薄的控制器。
  • 不太复杂的代码。如果我有一个名为PutEmployee(Employee employeeToUpdate)的动作,我不再需要先写入额外的逻辑来确定它是否存在,传递被跟踪的实体等等。应用服务处理所有这些。

在Controller Pros中返回代码:

  • 由于我正在使用ActionResult,而且我要么返回EmployeeNotFound()我不需要[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;
}

0 个答案:

没有答案