在Clean Architecture中处理响应代码决策的层

时间:2018-07-28 16:39:39

标签: asp.net-core clean-architecture mediatr

当前使用MediatR和

实施Clean Architure
.at-share-btn:nth-child(even) .at-icon {
    fill: red !important;
}

.at-share-btn:nth-child(odd) .at-icon {
    fill: blue !important;
}

现在,该实现将业务逻辑层,基础架构和控制器分开,它们依赖于依赖注入和解耦。

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

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

我想知道“清洁架构”层中的什么地方应该将制定的业务规则决策转换为正确的响应代码,以及进行这种调整的最佳实践或设定方法是什么。 似乎快速实现仍将在控制器中执行,但是想知道此决定是属于业务规则还是应用程序业务规则,并且在转换为表示层的响应代码之前应在不同的层中进行处理。 如果这样,Asp.Net核心或MediatR(或任何其他库)具有内置的框架或功能来支持这种设计。

2 个答案:

答案 0 :(得分:1)

我发现的一种方法如下

在业务层,

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

然后在控制器中

  return StatusCode(
                Convert.ToInt32(ValidationResult.Errors[0].ErrorCode),
                ValidationResult.Errors[0].ErrorMessage);

答案 1 :(得分:0)

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

例如,当您查询数据时,您将拥有一个请求处理程序,该请求处理程序使用给定的ID(GUID或其他名称)查找应找到的数据。现在,该标识符有效,但数据库中不存在该标识符。您不想在处理程序中访问httpcontext(even though you could),因为与之相比,您的businesslogic将耦合到asp.net。引发一个异常,通知您未找到产生404错误响应的资源(我们称其为ResourceNotFoundException,即)。对于该异常,您可以使用异常过滤器代替控制器端点上方的数据注释。您可以有许多异常过滤器。每个都有自己的目的。

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

如果您想查看一个异常过滤器如何工作的示例,我不久前为此创建了一个简单的解决方案。您可以找到它here

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