我们正在使用MediatR为我们的dotnet核心WebAPI后端实现一个“管道”,试图遵循CQRS原则。
我无法决定是否应该尝试实现IPipelineBehavior链,或者是否更好地构建一个新的请求,并在我的Handler方法中调用MediatR.Send (对于请求)。
设想的实质是:
选项1是我们现在拥有的:一个由一个类处理的DeleteRequest,其中Handler检查它是否被使用,将其标记为已删除,然后发送一个带有参数的新TaskStartRequest到Delete。
选项2是我正在考虑的:一个实现标记接口IRequireCheck,IStartTask的DeleteRequest,它有一个运行的管道:
IPipelineBehavior<IRequireCheck>首先检查这些东西是否被使用,IPipelineBehavior<DeleteRequest>标记数据库中删除的内容,以及IPipelineBehavior<IStartTask>启动任务。我还没有完全弄清楚备选方案2会是什么样子,但这是一般的想法。
我想我主要想知道在Handler中调用MediatR.Send(TRequest2)是否是TRequest1的代码气味。
发布于 2019-09-25 13:49:37
如果这些是您要使用的选项-我说选项2。从现有的Mediatr处理程序中发送请求可以被看作是一种代码嗅觉。你隐瞒了副作用,违反了单一责任原则。您还将您的请求耦合在一起,您应该尽量避免无法在另一种类型的请求之前发送一种请求的情况。
不过,我认为可能有另一种选择。如果没有事先的验证和标记,删除请求就无法发生,那么您就可以利用预处理器(这里的例子)对您的TaskStartRequest进行处理。这样,您可以有一个单一的请求,可以完成您所需的一切。这甚至通过简单地利用现有的Mediatr模式来反映您的管道示例。
发布于 2019-09-29 22:27:57
是否需要将任务分解为多个Handlers?也许我错过了mediatr的重点。这不就够了吗?
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();
}https://stackoverflow.com/questions/58084041
复制相似问题