You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF Prism应用中MediatR LoggingBehavior未触发问题排查

WPF Prism中MediatR的LoggingBehavior管道未触发问题排查

问题场景

在WPF Prism应用中尝试通过MediatR管道机制实现请求日志功能,但自定义的LoggingBehavior始终未触发,相关代码如下:

DI容器配置

containerRegistry.Register(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
containerRegistry.RegisterSingleton<IMediator, Mediator>();

LoggingBehavior类

public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    where TRequest : IRequest<TResponse>
{
    private readonly ILogger<LoggingBehavior<TRequest, TResponse>> _logger;

    public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> logger)
    {
        _logger = logger;
    }

    public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
    {
        _logger.LogInformation($"Handling {typeof(TRequest).Name}");

        var response = await next();

        _logger.LogInformation($"Handled {typeof(TResponse).Name}");

        return response;
    }
}

请求处理器

public class GetImportProjectDetailsQuery : IRequestHandler<GetImportProjectDetailsRequest, GetImportProjectDetailsResponse>
{
    private readonly IImportRepository _importRepository; 

    public GetImportProjectDetailsQuery(IImportRepository importRepository )
    {
        _importRepository = importRepository; 
    }

    public async Task<GetImportProjectDetailsResponse> Handle(GetImportProjectDetailsRequest request, CancellationToken cancellationToken)
    {
        // 业务逻辑代码
        return result;
    }
}

请求类型

public class GetImportProjectDetailsRequest : IRequest<GetImportProjectDetailsResponse>
{
    public string? Id { get; set; }
}

调用代码

private async Task<GetImportProjectDetailsResponse> GetImportProjectDetails(string projectId)
{
    var importProjectResult = await _mediator.Send(new GetImportProjectDetailsRequest {Id = projectId});

    return importProjectResult;
}

错误原因及修正方案

1. 核心错误:手动注册IMediator单例

手动注册IMediator为Singleton时,没有向Mediator的构造函数注入所需的IEnumerable<IPipelineBehavior<,>>集合,导致MediatR无法加载并执行你的LoggingBehavior。

2. 修正DI配置

移除手动注册IMediator的代码,让DI容器自动解析IMediator的实现(容器会自动注入所有已注册的IPipelineBehavior实例):

// 保留管道行为注册
containerRegistry.Register(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
// 移除以下手动注册代码
// containerRegistry.RegisterSingleton<IMediator, Mediator>();

// 确保请求处理器已注册到容器
containerRegistry.Register<IRequestHandler<GetImportProjectDetailsRequest, GetImportProjectDetailsResponse>, GetImportProjectDetailsQuery>();

3. 额外注意事项

  • 如果项目中有多个请求处理器,建议使用批量注册方式(例如通过程序集扫描),避免逐个注册的繁琐。
  • 确保日志组件(如Serilog、NLog)已正确配置,避免因日志未输出导致误判行为未触发。

内容的提问来源于stack exchange,提问作者Peter Krämer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:10:28