1

目前使用 MediatR 实施 Clean Architure

     IRequestHandler<IRequest<ResponseMessage>, ResponseMessage>
     IRequest<ResponseMessage>

现在实现在业务逻辑层、基础设施和控制器之间分离,它们依赖于依赖注入和解耦。

目前实现在 Asp.Net Core 中,该框架支持在控制器中完成响应代码生成,如下例所示。

    [HttpGet]
    [ProducesResponseType(200)]
    [ProducesResponseType(404)]
    public async Task<IActionResult> GetObject([FromQuery] int Id)
    {
      ...
      return Ok(some_result_to_show);   // This generates code 200
    }

我想知道 Clean Architecture 层应该在哪里将业务规则决策转换为正确的响应代码,以及进行这种适应的良好实践或设置方法。似乎快速实现仍然会在控制器中执行,但是想知道这个决定是属于业务规则还是应用程序业务规则,并且应该在转换为表示层的响应代码之前在不同的层中处理。如果那时 Asp.Net 核心或 MediatR(或任何其他库)具有支持此类设计的内置框架或功能。

4

2 回答 2

1

我发现的一种方法如下

在业务层,

  RequestMessageValidator : AbstractValidator<RequestMessage>
  {
     RuleFor(r => r).{ConditionSyntax}().WithErrorCode(ResponseCodeString);
  }

然后在控制器中,

  return StatusCode(
                Convert.ToInt32(ValidationResult.Errors[0].ErrorCode),
                ValidationResult.Errors[0].ErrorMessage);
于 2018-07-28T17:21:31.857 回答
0

绝对是 MVC 或您的控制器的应用程序/表示层。我建议您抛出仅用于一个目的的特定异常。

例如,当您查询数据时,您将有一个请求处理程序来查找应该使用给定 id(guid 或其他任何内容)找到的数据。现在该标识符是有效的,但它在您的数据库中不存在。您不想在处理程序中访问 httpcontext(即使您可以),因为您的业务逻辑将与 asp.net 耦合。抛出一个异常,告诉您找不到资源以产生 404 错误响应(我们称之为 ResourceNotFoundException 即)。对于该异常,您可以在控制器端点上方使用异常过滤器而不是数据注释。您可以有许多异常过滤器。每个都有自己的目的。

如果您这样做,您的业务逻辑将与任何应用程序/表示层分离,并且可以轻松地在您想要的任何地方重用。

如果你想看一个异常过滤器如何工作的例子,我刚才已经为此创建了一个简单的解决方案。你可以在这里找到它。

与您的问题没有直接关系,但是当您想向客户端发送数据时,您也可以返回一个数据传输对象,而不是返回一个 IActionResult。它还将产生一个 Http.OK 状态码。

于 2018-07-28T16:52:43.370 回答