使用 MediatR 链接处理程序

gak*_*era 5 architecture cqrs .net-core mediatr

我们正在使用 MediatR 为我们的 dotnet 核心 WebAPI 后端实现“管道”,试图遵循 CQRS 原则。

我无法决定是否应该尝试实现一个IPipelineBehavior链,或者最好构造一个新的 Request 并从我的 Handler 方法中调用 MediatR.Send(对于请求)。

场景基本上是这样的:

  • 用户请求要执行的操作,即删除某些内容
  • 我们必须检查某些东西是否被其他人使用
  • 我们必须在数据库中将该内容标记为已删除
  • 我们必须实际从文件系统中删除文件。

选项 1是我们现在所拥有的: ADeleteRequest由一个类处理,其中 Handler 检查它是否正在使用,将其标记为已删除,然后将TaskStartRequest带有参数的 new 发送到 Delete。

选项 2是我正在考虑的: ADeleteRequest实现标记接口IRequireCheck, IStartTask,以及运行的管道:

  1. IPipelineBehavior<IRequireCheck> 首先检查是否正在使用某些东西,
  2. IPipelineBehavior<DeleteRequest> 将数据库中的内容标记为已删除并
  3. IPipelineBehavior<IStartTask> 开始任务。

我还没有完全弄清楚选项 2 会是什么样子,但这是总体思路。

我想我主要想知道在处理程序中为 TRequest1 调用 MediatR.Send(TRequest2) 是否是代码异味。

小智 2

如果这些是您要使用的选项 - 我说选项 2。从现有 Mediatr 处理程序内部发送请求可以被视为代码异味。您隐藏了副作用并违反了单一责任原则。您还将请求耦合在一起,并且应该尽量避免无法在另一种类型之前发送一种类型的请求的情况。

不过,我认为可能还有其他选择。如果没有事先验证和标记就无法发生删除请求,您可以为您TaskStartRequest. 这样您就可以通过一个请求来完成您需要的一切。这甚至通过简单地利用现有的 Mediatr 模式来反映您的管道示例。