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
相关产品推荐
相关产品推荐

