【发布时间】:2020-01-24 19:10:17
【问题描述】:
我们正在使用 MediatR 为我们的 dotnet 核心 WebAPI 后端实现“管道”,试图遵循 CQRS 原则。
我无法决定是否应该尝试实现 IPipelineBehavior 链,或者是否应该构造一个新的请求并从我的 Handler 方法中调用 MediatR.Send 更好(对于请求)。
场景本质上是这样的:
- 用户请求要执行的操作,即删除某些内容
- 我们必须检查该东西是否被其他人使用
- 我们必须在数据库中将该内容标记为已删除
- 我们必须实际从文件系统中删除文件。
选项1是我们现在拥有的:一个DeleteRequest,由一个类处理,其中Handler检查它是否正在使用,将其标记为已删除,然后发送一个新的@ 987654323@带参数删除。
选项2是我正在考虑的:一个DeleteRequest,它实现了标记接口IRequireCheck、IStartTask,带有一个运行的管道:
-
IPipelineBehavior<IRequireCheck>先检查一下有没有被使用, -
IPipelineBehavior<DeleteRequest>将数据库中的内容标记为已删除,并 -
IPipelineBehavior<IStartTask>启动任务。
我还没有完全弄清楚选项 2 会是什么样子,但这是一般的想法。
我想我主要想知道在 TRequest1 的处理程序中调用 MediatR.Send(TRequest2) 是否是代码异味。
【问题讨论】:
-
您是否能够实施您的第二个选项?我发现有关 Pipelines and Behaviors 的文档在为我提供足够的上下文以将它们转换为我的情况方面缺乏,这与您的 #2 类似。
-
我们还没有实现该功能,它还不是优先事项,但很快就会实现。我学到了一些关于注册管道处理程序的有趣的东西,所以它使这更可行。我们在身份验证、审计日志记录和其他一些交叉问题上做类似的事情。
-
本质上,我们使用反射来注册标记接口类的处理程序,因此它们被正确注册为仅作为相应请求或响应类型的前置或后置处理器运行。我们将其用于 IAddToAuditLog 等标记接口。
标签: .net-core architecture cqrs mediatr