Asp.Net Core:如何在Program.cs中无冗余复用配置,兼顾依赖注入与认证配置读取
解决配置重复读取的方案
你可以通过一次性绑定配置到自定义类并获取实例的方式,既满足Program.cs中直接使用配置值的需求,又能保留依赖注入的能力,完全避免重复读取配置的冗余代码。
步骤1:确保你的AuthConfig类匹配配置结构
首先要保证自定义配置类的属性和appsettings.json里的配置键一一对应:
public class AuthConfig { public string SecretKey { get; set; } = string.Empty; public string Issuer { get; set; } = string.Empty; public string Audience { get; set; } = string.Empty; // 其他需要的配置项也在这里添加 }
步骤2:在Program.cs中一次绑定、两用配置
不需要分开多次读取配置,只做一次绑定,同时拿到实例用于配置认证,并且保留DI注册供后续使用:
var builder = WebApplication.CreateBuilder(args); // 一次性绑定配置节到AuthConfig实例,同时做非空校验 var authConfig = builder.Configuration.GetSection("Auth").Get<AuthConfig>() ?? throw new InvalidOperationException("Auth配置未找到或格式无效"); // 注册配置到DI容器,供控制器/服务通过IOptions<AuthConfig>注入 builder.Services.Configure<AuthConfig>(builder.Configuration.GetSection("Auth")); builder.Services.AddAuthorization(); builder.Services .AddAuthentication(opt => { opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters{ ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = authConfig.Issuer, ValidAudience = authConfig.Audience, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authConfig.SecretKey)) }; }); builder.Services.AddControllers(); // ...其他服务注册逻辑
方案优势说明
- 彻底消除冗余:所有配置读取只执行一次,既给Program.cs提供了实例,又完成了DI注册。
- 保留DI能力:在控制器或其他服务中,依然可以通过标准方式注入配置:
[ApiController] [Route("api/[controller]")] public class TestController : ControllerBase { private readonly AuthConfig _authConfig; public TestController(IOptions<AuthConfig> authConfigOptions) { _authConfig = authConfigOptions.Value; } // 业务逻辑中直接使用_authConfig的属性即可 } - 启动时校验:通过
?? throw的方式,在应用启动阶段就能发现配置缺失问题,避免运行时才暴露错误。
额外优化:更严格的配置验证
如果需要对配置项做更细致的校验(比如SecretKey长度要求),可以手动绑定并添加验证逻辑:
var authConfigSection = builder.Configuration.GetSection("Auth"); var authConfig = new AuthConfig(); authConfigSection.Bind(authConfig); // 自定义校验规则 if (string.IsNullOrWhiteSpace(authConfig.SecretKey) || authConfig.SecretKey.Length < 16) { throw new InvalidOperationException("Auth配置中的SecretKey不能为空且长度不能小于16位"); } if (string.IsNullOrWhiteSpace(authConfig.Issuer)) { throw new InvalidOperationException("Auth配置中的Issuer不能为空"); } builder.Services.Configure<AuthConfig>(authConfigSection);
内容的提问来源于stack exchange,提问作者egeo
相关产品推荐
相关产品推荐

