.NET Core 中的选项模式验证与示例

作者:微信公众号:【架构师老卢】
9-20 19:45
101

为了确保正确验证您的设置,.NET 提供了一些内置资源。借助这些工具,您可以快速验证选项的属性,而无需执行任何任务,例如:

var issuer = builder.Configuration.GetValue<string>("JwtConfigSettings:Issuer");  
  
if (string.IsNullOrEmpty(issuer))  
{  
    throw new ArgumentNullException(nameof(issuer));  
}

var issuer = builder.Configuration.GetValue<string>("JwtConfigSettings:Issuer");  
  
ArgumentNullException.ThrowIfNull(nameof(issuer));

让我们检查一下 options validations 的实现方法。

数据注释

使用数据注释是一种简单的方法。

我们使用用于标记要验证的属性的属性。

public class JwtConfigSettings
{
    public const string Key = "JwtConfigSettings";

    [Required(ErrorMessage = "Issuer is required.")]
    [Range(1, 20, ErrorMessage = "Issuer limit is exceeded.")]
    public string Issuer { get; set; }

    [Required(ErrorMessage = "Audience is required.")]
    public string Audience { get; set; }

    [Required(ErrorMessage = "Validate expiration is required.")]
    public bool ValidateExpiration { get; set; }

    [Required(ErrorMessage = "Sign-in key is required.")]
    public string SignInKey { get; set; }
}

如果要验证这一点,那么我们需要在绑定配置后添加 ValidateDataAnnotation 扩展方法。

builder.Services  
  .AddOptions<JwtConfigSettings>()  
  .Bind(builder.Configuration.GetSection(JwtConfigSettings.Key))  
  .ValidateDataAnnotations();

每次注入或使用 JwtConfigSettings 属性时,都会验证它们。

如果您希望在程序启动时验证 ValidateOnStart() 函数,则可以添加该函数,这在大多数情况下更有意义。

builder.Services  
  .AddOptions<JwtConfigSettings>()  
  .Bind(builder.Configuration.GetSection(JwtConfigSettings.Key))  
  .ValidateDataAnnotations()  
  .ValidateOnStart();

如果我们想要检查自定义验证,那么我们需要使用 Validate 方法:

builder.Services  
  .AddOptions<JwtConfigSettings>()  
  .Bind(builder.Configuration.GetSection(JwtConfigSettings.Key))  
  .ValidateDataAnnotations()  
  .Validate(option => option.Audience.Length <= 20, "Audience limit is exceeded.")  
  .ValidateOnStart();

使用 IValidateOptions<T> 接口,我们还可以清理此内容并将验证分配给相应的服务。它帮助我们简单地使用依赖注入并将我们的验证与配置解耦。

为此,我们必须构造一个新类 JwtConfigSettingsValidation,并要求它实现 IValidateOptions<JwtConfigSettings> 接口。然后,必须实现允许您返回 ValidateOptionsResult 的 Validate 方法。如果验证不成功,则返回 Fail(message)ValidateOptionsResult。如果验证成功,则为 SUCCESS。

public class JwtConfigSettingsValidation : IValidateOptions<JwtConfigSettings>
{
    private readonly ILogger<JwtConfigSettingsValidation> _logger;

    public JwtConfigSettingsValidation(ILogger<JwtConfigSettingsValidation> logger)
    {
        _logger = logger;
    }

    public ValidateOptionsResult Validate(string name, JwtConfigSettings options)
    {
        _logger.LogInformation("Validating options");

        if (options.Audience.Length >= 20)
        {
            return ValidateOptionsResult.Fail("Audience limit is exceeded.");
        }

        return ValidateOptionsResult.Success;
    }
}

我们需要在 Program.cs 文件中注册此实现以验证配置。

builder.Services  
  .AddTransient<IValidateOptions<JwtConfigSettings>, JwtConfigSettingsValidation>();

我为 applications.json 添加了以下配置

{  
  "JwtConfigSettings": {  
    "Issuer": "",  
    "Audience": "Jaimin Jaimin Jaimin Jaimin Jaimin Jaimin Jaimin Jaimin",  
    "ValidateExpiration": false,  
    "SignInKey": "Jaimin sign in key"  
  }  
}

让我们运行应用程序并验证配置。

相关留言评论
昵称:
邮箱:
阅读排行