如何立即使用选项(通过 services.Configure<> 映射)获取我的 class 的对象?

How to get an object of my class with options (that mapped via services.Configure<>) immediately?

我要为我的网站使用 JWT Bearer Authorization。但是这个的配置占用了很多地方Startup.cs。我决定我需要在静态 class 中创建类似扩展方法的东西,以使我的 Startup.cs 更具可读性。这是此扩展方法的代码:

    public static IServiceCollection AddAuthenticationWithBearer(this IServiceCollection services,
        IConfiguration configuration)
    {
        services.Configure<AuthOptions>(configuration.GetSection("JwtOptions"));

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

        services.AddScoped<IJwtService, JwtService>();

        // Can I use already mapped AuthOptions instead of this ???
        var jwtConfigurationSection = configuration.GetSection("JwtOptions");
        
        services.AddAuthentication().AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = jwtConfigurationSection.GetValue<bool>("ValidateIssuer"),
                ValidIssuer = jwtConfigurationSection.GetValue<string>("ValidIssuer"),
                ValidateAudience = jwtConfigurationSection.GetValue<bool>("ValidateAudience"),
                ValidAudience = jwtConfigurationSection.GetValue<string>("ValidAudience"),
                ValidateLifetime = jwtConfigurationSection.GetValue<bool>("ValidateLifetime"),
                IssuerSigningKey =
                    new SymmetricSecurityKey(Encoding.ASCII.GetBytes(configuration["AuthJwtSecret"])),
                ValidateIssuerSigningKey = jwtConfigurationSection.GetValue<bool>("ValidateIssuerSigningKey"),
            };
        });

        services.AddAuthorization();

        return services;
    }

评论下我的主要问题。我知道 services.Configure<AuthOptions>(configuration.GetSection("JwtOptions")); 的便利机制。因此,appsettings.json 中的 'JwtOptions' 部分映射到 AuthOptions class。但我不知道如何在这里使用它!如你所见,我这里有configuration.GetSection("JwtOptions");的调用,但我不喜欢。我想使用映射 AuthOptions class。我想你明白我的原因:1)如果我要改变appsettings.json-我只有一个地方需要考虑改变。是 AuthOptions。接下来 - IDE 将突出显示其余部分。 2) 我只想用一种方法从 appsettings.json 获取配置。我喜欢映射 class 的方式,比如 AuthOptions.

我假设您正在寻找 Bind 方法。

AuthOptions authOptions= new AuthOptions();
configuration.GetSection("JwtOptions").Bind(authOptions);
TokenValidationParameters tokenValidationParameters = new TokenValidationParameters()
{
   ValidateIssuer = authOptions.ValidateIssuer,
   ValidIssuer = authOptions.ValidIssuer
   // etc.
}

services
   .Configure<AuthOptions>(authOptions);
services
   .AddAuthentication()
   .AddJwtBearer(options =>
   {
      options.TokenValidationParameters = tokenValidationParameters
   };