【发布时间】:2017-02-21 14:47:32
【问题描述】:
我使用的是 ASP.NET Core 和新的 MediatR which supports pipelines。我的管道includes validation。
考虑这个动作:
[HttpPost]
[HandleInvalidCommand]
public IActionResult Foo(Command command)
{
await _mediator.Send(command);
return View();
}
- 命令已验证(我正在使用 FluentValidation)
-
HandleInvalidCommand检查ModelState.IsValid,如果无效则重定向到视图以供用户更正数据 - 否则操作会运行
- 命令被发送到管道中
- 管道再次验证命令
因此,如果命令有效,则验证会发生两次(并且验证器的运行成本很高)。
我怎样才能最好地处理这个问题?
编辑:显而易见的方法是从管道中删除验证,但这并不好,因为命令可能来自 UI,也来自应用程序本身。并且您希望在这两种情况下都进行验证。
【问题讨论】:
-
HandleInvalidCommand属性本身是否运行验证? -
@MickaëlDerriey Nope FluentValidation 在模型绑定期间自动验证参数。该属性只检查
ModelState.IsValid并将视图重定向回。我进行了编辑以使其更清晰。 -
好的。所以是的,我想您必须在作为模型绑定的一部分或作为 MediatR 管道的一部分运行验证之间做出选择。这真的是一种“视情况而定” 的情况。一方面,在模型绑定期间加入它可以更容易地在 MVC 级别处理错误。另一方面,将其作为 MediatR 管道的一部分使其成为一个横切关注点,因此如果您选择将管道插入另一个应用程序/框架中,则非常适用。不过,处理错误可能会更棘手。验证行为可能会引发操作过滤器可以捕获和处理的异常。
-
@MickaëlDerriey 是的,这就是问题所在。但我在下面添加了一个折衷的解决方案。当你有机会时,很想知道你对它的看法。
标签: c# asp.net-core cqrs fluentvalidation mediatr