如何将IConfiguration注入作为控制器入参的类中
给FromQuery绑定的UserQuery注入IConfiguration的方案
因为UserQuery是通过[FromQuery]进行模型绑定的,默认会使用无参构造函数创建实例,无法直接通过构造函数注入IConfiguration,可以通过以下两种方式实现需求:
方案一:自定义模型绑定器(推荐用于UserQuery内部需直接使用配置的场景)
通过自定义模型绑定器,控制UserQuery的实例创建过程,注入IConfiguration:
- 创建自定义模型绑定器
public class UserQueryModelBinder : IModelBinder { private readonly IConfiguration _configuration; public UserQueryModelBinder(IConfiguration configuration) { _configuration = configuration; } public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) throw new ArgumentNullException(nameof(bindingContext)); // 从查询参数中提取字段值 var name = bindingContext.ValueProvider.GetValue("Name").FirstValue; var surname = bindingContext.ValueProvider.GetValue("Surname").FirstValue; // 创建UserQuery实例并注入IConfiguration var userQuery = new UserQuery(_configuration) { Name = name, Surname = surname }; bindingContext.Result = ModelBindingResult.Success(userQuery); return Task.CompletedTask; } }
- 修改UserQuery类,添加带参构造函数
public class UserQuery { public string Name { get; set; } public string Surname { get; set; } public IConfiguration Configuration { get; } // 保留无参构造,兼容其他可能的使用场景 public UserQuery() {} // 用于注入IConfiguration的构造函数 public UserQuery(IConfiguration configuration) { Configuration = configuration; } }
- 注册模型绑定器
有两种注册方式可选:
- 方式一:给UserQuery添加特性标记
[ModelBinder(BinderType = typeof(UserQueryModelBinder))] public class UserQuery { // 类内容不变 }
- 方式二:全局注册绑定器(.NET 6+)
在Program.cs中添加:
builder.Services.AddControllers(options => { options.ModelBinderProviders.Insert(0, new BinderTypeModelBinderProvider(typeof(UserQueryModelBinder))); });
- 控制器端无需修改
原端点代码保持不变,现在query.Configuration已注入可用:
[HttpGet("[action]")] public async Task<IActionResult> ProcessUser([FromQuery] UserQuery query) { var configValue = query.Configuration["YourConfigKey"]; // 业务逻辑处理 return Ok(); }
方案二:控制器注入后传递配置(适合仅在控制器处理时结合配置的场景)
如果不需要UserQuery内部持有配置,可在控制器中注入IConfiguration,再传递给UserQuery:
- 控制器注入IConfiguration
private readonly IConfiguration _configuration; public YourController(IConfiguration configuration) { _configuration = configuration; }
- 在端点中传递配置给UserQuery
[HttpGet("[action]")] public async Task<IActionResult> ProcessUser([FromQuery] UserQuery query) { // 通过方法或属性传递配置 query.SetConfiguration(_configuration); // 后续业务逻辑 return Ok(); }
- UserQuery添加配置接收方法
public class UserQuery { public string Name { get; set; } public string Surname { get; set; } private IConfiguration _configuration; public void SetConfiguration(IConfiguration configuration) { _configuration = configuration; } }
内容的提问来源于stack exchange,提问作者tylkonachwile
相关产品推荐
相关产品推荐

