3

我想尝试 MediatR 中的新管道功能:https ://github.com/jbogard/MediatR/wiki/Behaviors

我尝试了以下,但它没有得到执行

services.AddMediatR();                    
services.AddTransient(typeof(IRequestPostProcessor<,>), typeof(PostHandler<,>));

我错过了什么?

4

2 回答 2

9

您需要注册与后处理器相关的行为,如本单元测试所示。

您的注册码如下所示:

services.AddMediatR();
services.AddTransient(typeof(IRequestPostProcessor<,>), typeof(PostHandler<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPostProcessorBehavior<,>));

行为将获取您注册的所有后处理器并执行它们。

编辑

在对后处理器运行两次发表评论后,我查看了在 ASP.NET Core 内置 DI 容器中注册 MediatR 的代码,结果发现IRequestPreProcessor<TRequest, TResponse>和的实例IRequestPostProcessor<TRequest, TResponse>会自动注册,如您在此处看到的。为了让它们在管道中运行,剩下要做的就是注册相关的行为。所以必要的注册是:

services.AddMediatR();
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPostProcessorBehavior<,>));
于 2017-02-19T22:18:33.613 回答
0

我在上面的评论中遇到了与 Larsi 相同的问题。我的代码看起来像这样

services.AddScoped<IPipelineBehavior<AddMessageRequest, MessageResponse>, RequestPostProcessorBehavior<AddMessageRequest, MessageResponse>>();

但该行为仍然执行了两次。我的解决方案是简单地不手动注册它,现在好像注册是另外处理的。

在我的情况下services.AddMediatR(Assembly.GetExecutingAssembly());就足够了。

如果有人可以扩展为什么会这样,那就太好了。

于 2019-07-23T07:37:09.763 回答