使用 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<TRequest, TResponse>' requires 2 type arguments.
和 MyBehavior
的相同错误。
The docs 提及Unit
struct。如何使用它?
【问题讨论】:
【参考方案1】:正如 Mickaël Derriey 指出的那样,MediatR 已经定义了 IRequest、IRequestHandler 和 IAsyncRequestHandler,以便在不需要时不返回值。
如果您查看IRequest,您可以看到它实际上继承自IRequest<Unit>
,这意味着当您处理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 为您不想返回值的情况定义了特定的IRequest
、IRequestHandler
和 IAsyncRequestHandler
类型。与将 Unit
指定为返回类型的行为相同,语义更接近您尝试实现的目标,因为您不需要在处理程序中返回 Unit
实例。以上是关于使用 void/Task 响应注册 MediatR 管道的主要内容,如果未能解决你的问题,请参考以下文章
如何为 ASP.NET Core 注册和使用 MediatR 管道处理程序?
ASP.NET Core MediatR错误:使用容器注册处理程序
ASP.NET Core MediatR 错误:向容器注册处理程序