【问题标题】:MediatR: INotification handler is being called multiple timesMediatR:INotification 处理程序被多次调用
【发布时间】:2021-09-07 07:45:18
【问题描述】:

我正在使用 MediatR 9.0.0(带有 MediatR.Extensions.Microsoft.DependencyInjection 9.0.0)。我有这样的事件通知处理程序:

public class StatusChangedEventHandler : INotificationHandler<StatusChangedEvent>
{
    
   public StatusChangedEventHandler ()
   {
   }
    
   public async Task Handle(StatusChangedEvent evnt, CancellationToken cancellationToken)
   {
      //some code 
   }
}

事件正在从另一个命令处理程序发布:

public class ChangeStatusCommandHandler : IRequestHandler<ChangeStatusCommand, bool>
    {
        ...
        private readonly IMediator _mediator;

        public ChangeStatusCommandHandler(...,IMediator mediator)
        {
            ...
            _mediator = mediator;
        }

        public async Task<bool> Handle(ChangeStatusCommand command, CancellationToken cancellationToken)
        {

            ...

            await _mediator.Publish(new StatusChangedEvent(int id, string message));

            ...
            
        }
    }

问题是多次调用 StatusChangedEventHandler.Handle 方法 - 我注意到它似乎与在 Startup.cs 中注册的命令处理程序的数量有关,例如

services.AddMediatR(typeof(CommandA));

=> 处理程序将被调用一次

services.AddMediatR(typeof(CommandA));
services.AddMediatR(typeof(CommandB));

=> 处理程序将被调用两次

services.AddMediatR(typeof(CommandA));
services.AddMediatR(typeof(CommandB));
services.AddMediatR(typeof(CommandC));

=> 处理程序将被调用 3 次等等。

如何解决这个问题以使处理程序只被调用一次?

【问题讨论】:

  • 您能展示一下您是如何发布活动的吗?
  • 添加事件发布代码

标签: c# asp.net mediatr


【解决方案1】:

services.AddMediatR(typeof(CommandA)) 的调用不仅注册了单个命令处理程序CommandA,它还注册了包含CommandA 的程序集中存在的所有命令处理程序;正在扫描整个程序集的处理程序。

来自documentation

扫描程序集并添加处理程序、预处理器和后处理器 容器的实现。与 IServiceCollection 一起使用 实例:

您不能在其他命令处理程序上显式调用AdMediatR; 删除下面的。

services.AddMediatR(typeof(CommandB));
services.AddMediatR(typeof(CommandC));

【讨论】:

  • 太棒了!不知道为什么我以前没有遇到过这个问题,但无论如何你拯救了我的一天,谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多