首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用MediatR链接处理程序

用MediatR链接处理程序
EN

Stack Overflow用户
提问于 2019-09-24 15:50:53
回答 2查看 5.4K关注 0票数 9

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

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

设想的实质是:

  • 用户请求要执行的操作,即删除某项操作
  • 我们得检查一下是否有人在用那个东西
  • 我们必须在数据库中将其标记为已删除
  • 我们必须从文件系统中删除文件。

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

选项2是我正在考虑的:一个实现标记接口IRequireCheckIStartTaskDeleteRequest,它有一个运行的管道:

  1. IPipelineBehavior<IRequireCheck>首先检查这些东西是否被使用,
  2. IPipelineBehavior<DeleteRequest>标记数据库中删除的内容,以及
  3. IPipelineBehavior<IStartTask>启动任务。

我还没有完全弄清楚备选方案2会是什么样子,但这是一般的想法。

我想我主要想知道在Handler中调用MediatR.Send(TRequest2)是否是TRequest1的代码气味。

EN

回答 2

Stack Overflow用户

发布于 2019-09-25 13:49:37

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

不过,我认为可能有另一种选择。如果没有事先的验证和标记,删除请求就无法发生,那么您就可以利用预处理器(这里的例子)对您的TaskStartRequest进行处理。这样,您可以有一个单一的请求,可以完成您所需的一切。这甚至通过简单地利用现有的Mediatr模式来反映您的管道示例。

票数 2
EN

Stack Overflow用户

发布于 2019-09-29 22:27:57

是否需要将任务分解为多个Handlers?也许我错过了mediatr的重点。这不就够了吗?

代码语言:javascript
复制
public async Task<Result<IFailure,ISuccess>> Handle(DeleteRequest request)
{
  var thing = await this.repo.GetById(request.Id);

  if (thing.IsBeignUsed())
  {
    return Failure.BeignUsed();
  }
  var deleted = await this.repo.Delete(request.Id);
  return deleted ? new Success(request.Id) : Failure.DbError();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58084041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档