使用 void/Task 响应注册 MediatR 管道

Posted

技术标签:

【中文标题】使用 void/Task 响应注册 MediatR 管道【英文标题】:Register a MediatR pipeline with void/Task response 【发布时间】:2017-07-12 03:44:25 【问题描述】:

我的命令:

public class Command : IRequest  ... 

我的处理程序:

public class CommandHandler : IAsyncRequestHandler<Command>  ... 

我的管道注册(不使用开放泛型):

services.AddTransient<IPipelineBehavior<Command>, MyBehavior<Command>>();

但这不起作用:Using the generic type 'IPipelineBehavior&lt;TRequest, TResponse&gt;' requires 2 type arguments.MyBehavior 的相同错误。

The docs 提及Unit struct。如何使用它?

【问题讨论】:

【参考方案1】:

正如 Mickaël Derriey 指出的那样,MediatR 已经定义了 IRequest、IRequestHandler 和 IAsyncRequestHandler,以便在不需要时不返回值。

如果您查看IRequest,您可以看到它实际上继承自IRequest&lt;Unit&gt;,这意味着当您处理Command 时,您的管道行为MyBehavior 将默认返回Unit 结构作为响应而不需要为您的Command 指定一个明确的响应。

举个例子:

public class Command : IRequest  ... 
public class CommandHandler : IAsyncRequestHandler<Command>  ... 

services.AddTransient<IPipelineBehavior<Command,Unit>, MyBehavior<Command,Unit>>();

【讨论】:

【参考方案2】:

我想我已经弄明白了,而且到目前为止似乎还有效。

public class Command : IRequest<Unit>  ... 
public class CommandHandler : IAsyncRequestHandler<Command, Unit>  ... 

services.AddTransient<IPipelineBehavior<Command,Unit>, MyBehavior<Command,Unit>>();

【讨论】:

MediatR 为您不想返回值的情况定义了特定的 IRequestIRequestHandlerIAsyncRequestHandler 类型。与将 Unit 指定为返回类型的行为相同,语义更接近您尝试实现的目标,因为您不需要在处理程序中返回 Unit 实例。

以上是关于使用 void/Task 响应注册 MediatR 管道的主要内容,如果未能解决你的问题,请参考以下文章

如何为 ASP.NET Core 注册和使用 MediatR 管道处理程序?

ASP.NET Core MediatR错误:使用容器注册处理程序

来自管道行为的 MediatR 流畅的验证响应

ASP.NET Core MediatR 错误:向容器注册处理程序

返回带有错误的响应,而不是在验证管道 mediatr 3 中抛出异常

使用 ServiceStack 设置 MediatR