MediatR:INotification 处理程序被多次调用

Vla*_*tov 2 c# asp.net mediatr

我正在使用 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 
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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));

            ...
            
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

services.AddMediatR(typeof(CommandA));
Run Code Online (Sandbox Code Playgroud)

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

services.AddMediatR(typeof(CommandA));
services.AddMediatR(typeof(CommandB));
Run Code Online (Sandbox Code Playgroud)

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

services.AddMediatR(typeof(CommandA));
services.AddMediatR(typeof(CommandB));
services.AddMediatR(typeof(CommandC));
Run Code Online (Sandbox Code Playgroud)

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

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

pfx*_*pfx 5

调用services.AddMediatR(typeof(CommandA))不仅会注册单个命令处理程序CommandA,还会注册包含以下内容的程序集中存在的所有命令处理程序CommandA:正在扫描整个程序集以查找其处理程序。

文档中

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

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

services.AddMediatR(typeof(CommandB));
services.AddMediatR(typeof(CommandC));
Run Code Online (Sandbox Code Playgroud)