You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.Net 6.0 Program.cs中builder.Build()执行时依赖注入报错

问题解决:ASP.NET 6 中 builder.Build() 依赖注入验证失败

核心错误原因

错误日志明确指出:AuthManager 激活时无法解析 Core.Security.JWT.TokenOptions 类型的服务。这说明你仅将AuthManager注册到了DI容器,但它的构造函数依赖的TokenOptions未被注册,导致服务提供者构建时验证不通过。

解决步骤

  1. 确认TokenOptions的配置来源
    TokenOptions一般是对应配置文件(如appsettings.json)的配置类,先确保你的配置文件中有对应的节点:
{
  "TokenOptions": {
    "Audience": "your-app-audience",
    "Issuer": "your-app-issuer",
    "AccessTokenExpiration": 15,
    "RefreshTokenExpiration": 60,
    "SecurityKey": "your-256-bit-security-key-here"
  }
}
  1. 将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"));
    
  1. 检查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;
        }
        // ...其他方法
    }
    
  1. 调整注册顺序
    确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:25:53