如何向InvalidModelStateResponseFactory委托注入依赖?
在InvalidModelStateResponseFactory中使用Scoped错误处理服务
你可以通过ActionContext的HttpContext.RequestServices获取当前请求的ScopedIErrorHandlingService实例——这个服务提供者和当前请求绑定,能正确拿到对应Scoped生命周期的实例。
首先确保你已经把错误处理服务注册为Scoped:
services.AddScoped<IErrorHandlingService, ErrorHandlingService>();
然后修改ApiBehaviorOptions的配置代码:
services.Configure<ApiBehaviorOptions>(options => { options.InvalidModelStateResponseFactory = (actionContext) => { // 从当前请求的服务容器中获取Scoped的错误处理服务 var errHandler = actionContext.HttpContext.RequestServices .GetRequiredService<IErrorHandlingService>(); // 遍历ModelState中的所有错误并添加到服务中 foreach (var keyValuePair in actionContext.ModelState) { var modelErrors = keyValuePair.Value.Errors; if (modelErrors.Count == 0) continue; foreach (var modelError in modelErrors) { errHandler.AddError(new MyCustomError() { // 根据需求填充错误信息,例如: Message = modelError.ErrorMessage, Field = keyValuePair.Key }); } } // 返回统一格式的错误响应 return new BadRequestObjectResult(errHandler.ErrorResponse); }; });
关键说明
HttpContext.RequestServices是当前请求的服务提供者,专门用于获取和请求同生命周期的服务(Scoped或Transient),正好匹配你的IErrorHandlingService的Scoped生命周期。- 这样处理后,模型绑定错误会被统一收集到错误处理服务中,既保持所有错误响应格式一致,也能和业务代码中添加的错误合并返回。
内容的提问来源于stack exchange,提问作者penny
相关产品推荐
相关产品推荐

