ASP.Net 6.0 Program.cs中builder.Build()执行时依赖注入报错
问题解决:ASP.NET 6 中
builder.Build() 依赖注入验证失败 核心错误原因
错误日志明确指出:AuthManager 激活时无法解析 Core.Security.JWT.TokenOptions 类型的服务。这说明你仅将AuthManager注册到了DI容器,但它的构造函数依赖的TokenOptions未被注册,导致服务提供者构建时验证不通过。
解决步骤
- 确认
TokenOptions的配置来源TokenOptions一般是对应配置文件(如appsettings.json)的配置类,先确保你的配置文件中有对应的节点:
{ "TokenOptions": { "Audience": "your-app-audience", "Issuer": "your-app-issuer", "AccessTokenExpiration": 15, "RefreshTokenExpiration": 60, "SecurityKey": "your-256-bit-security-key-here" } }
- 将
TokenOptions注册到DI容器
根据AuthManager构造函数的依赖方式,选择对应的注册方式:
- 如果
AuthManager直接依赖TokenOptions实例:// 在Program.cs或服务注册类中,先绑定配置再注册 var tokenOptions = builder.Configuration.GetSection("TokenOptions").Get<TokenOptions>(); services.AddSingleton(tokenOptions); - 如果
AuthManager依赖IOptions<TokenOptions>(推荐的配置注入方式):// 绑定配置节到IOptions<TokenOptions> services.Configure<TokenOptions>(builder.Configuration.GetSection("TokenOptions"));
- 检查
AuthManager构造函数匹配
确保构造函数的依赖和你注册的方式一致:
- 对应直接实例注入的构造函数:
public class AuthManager : IAuthService { private readonly TokenOptions _tokenOptions; public AuthManager(TokenOptions tokenOptions) { _tokenOptions = tokenOptions; } // ...其他方法 } - 对应
IOptions注入的构造函数:public class AuthManager : IAuthService { private readonly TokenOptions _tokenOptions; public AuthManager(IOptions<TokenOptions> tokenOptions) { _tokenOptions = tokenOptions.Value; } // ...其他方法 }
- 调整注册顺序
确保TokenOptions的注册代码在services.AddScoped<IAuthService, AuthManager>()之前执行,比如修改你的AddApplicationServices方法:
public static IServiceCollection AddApplicationServices(this IServiceCollection services, IConfiguration configuration) { // 先注册TokenOptions services.Configure<TokenOptions>(configuration.GetSection("TokenOptions")); services.AddAutoMapper(Assembly.GetExecutingAssembly()); services.AddMediatR(Assembly.GetExecutingAssembly()); services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly()); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(AuthorizationBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(CachingBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(CacheRemovingBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>)); services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestValidationBehavior<,>)); services.AddScoped<IAuthService, AuthManager>(); services.AddScoped<IUserService, UserManager>(); services.AddSingleton<LoggerServiceBase, FileLogger>(); return services; }
然后在Program.cs中调用时传入configuration:
builder.Services.AddApplicationServices(builder.Configuration);
验证
完成上述步骤后,重新执行builder.Build(),DI容器就能正确解析AuthManager的依赖,错误应该会消失。
内容的提问来源于stack exchange,提问作者redingel
相关产品推荐
相关产品推荐

