我想尝试 MediatR 中的新管道功能:https ://github.com/jbogard/MediatR/wiki/Behaviors
我尝试了以下,但它没有得到执行
services.AddMediatR();
services.AddTransient(typeof(IRequestPostProcessor<,>), typeof(PostHandler<,>));
我错过了什么?
我想尝试 MediatR 中的新管道功能:https ://github.com/jbogard/MediatR/wiki/Behaviors
我尝试了以下,但它没有得到执行
services.AddMediatR();
services.AddTransient(typeof(IRequestPostProcessor<,>), typeof(PostHandler<,>));
我错过了什么?
您需要注册与后处理器相关的行为,如本单元测试所示。
您的注册码如下所示:
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<,>));
我在上面的评论中遇到了与 Larsi 相同的问题。我的代码看起来像这样
services.AddScoped<IPipelineBehavior<AddMessageRequest, MessageResponse>, RequestPostProcessorBehavior<AddMessageRequest, MessageResponse>>();
但该行为仍然执行了两次。我的解决方案是简单地不手动注册它,现在好像注册是另外处理的。
在我的情况下services.AddMediatR(Assembly.GetExecutingAssembly());就足够了。
如果有人可以扩展为什么会这样,那就太好了。