如何将日志记录器注入MediatR命令处理程序?
解决MediatR中从控制器传递日志记录器到命令处理程序的问题
首先,你不需要手动从控制器传递日志记录器——依赖注入(DI)才是正确的方式,MediatR和ASP.NET Core的DI系统完全兼容,直接在命令处理程序中注入日志记录器即可,根本不需要通过命令对象传递。
具体实现步骤:
步骤1:确认日志服务已注册
ASP.NET Core默认已注册ILogger<T>服务,无需额外配置,直接使用即可。步骤2:在命令处理程序中注入日志记录器
直接在处理程序的构造函数中注入ILogger<YourHandler>,示例代码如下:public class YourCommandHandler : IRequestHandler<YourCommand, YourResult> { private readonly ILogger<YourCommandHandler> _logger; // 构造函数注入日志记录器 public YourCommandHandler(ILogger<YourCommandHandler> logger) { _logger = logger; } public async Task<YourResult> Handle(YourCommand request, CancellationToken cancellationToken) { // 直接使用日志记录器输出日志 _logger.LogInformation("开始处理命令:{CommandName}", nameof(YourCommand)); // 执行业务逻辑... return new YourResult(); } }步骤3:控制器中无需传递日志对象
控制器仅负责接收请求、发送命令即可,日志记录器不需要通过命令对象传递:[ApiController] [Route("api/[controller]")] public class YourController : ControllerBase { private readonly IMediator _mediator; private readonly ILogger<YourController> _controllerLogger; public YourController(IMediator mediator, ILogger<YourController> controllerLogger) { _mediator = mediator; _controllerLogger = controllerLogger; } [HttpPost] public async Task<IActionResult> Post(YourCommand command) { _controllerLogger.LogInformation("收到命令请求,准备发送至MediatR处理"); var result = await _mediator.Send(command); return Ok(result); } }
核心逻辑说明:
MediatR在解析命令处理程序时,会通过ASP.NET Core的DI容器自动注入所有依赖项,包括日志记录器。命令对象的职责仅为承载业务数据,不需要传递服务类(如日志器),这符合单一职责原则——命令负责传输数据,处理程序负责执行业务逻辑并记录日志。
如果需要在日志中关联请求上下文(如请求ID),可以通过MediatR的IPipelineBehavior实现拦截,将请求ID等上下文信息加入日志作用域,这样处理程序的日志会自动带上上下文标识,无需手动传递。
内容的提问来源于stack exchange,提问作者Inglonias
相关产品推荐
相关产品推荐

