gpt4 book ai didi

c# - 如何在 IValidateOptions 实现中触发模型验证?

转载 作者:行者123 更新时间:2023-12-03 23:38:38 24 4
gpt4 key购买 nike

我有一个 .Net 5 应用程序,想为我的配置添加验证器。鉴于此示例选项

public sealed class DatabaseOptions
{
public string ConnectionString { get; set; }
}
我目前使用此实现对其进行验证
public sealed class DatabaseOptionsValidator : IValidateOptions<DatabaseOptions>
{
public ValidateOptionsResult Validate(string name, DatabaseOptions databaseOptions)
{
List<string> validationFailures = new List<string>();

if (string.IsNullOrEmpty(databaseOptions.ConnectionString))
validationFailures.Add($"{nameof(databaseOptions.ConnectionString)} is required.");

// ...

if (validationFailures.Any())
{
return ValidateOptionsResult.Fail(validationFailures);
}

return ValidateOptionsResult.Success;
}
}
我想避免实现我自己的验证检查和错误消息,因为我知道数据注释已经完成了工作。
我将选项模型修改为此
public sealed class DatabaseOptions
{
[Required]
[MinLength(9999999)] // for testing purposes
public string ConnectionString { get; set; }
}
并希望找到一种方法来触发模型验证
public sealed class DatabaseOptionsValidator : IValidateOptions<DatabaseOptions>
{
public ValidateOptionsResult Validate(string name, DatabaseOptions databaseOptions)
{
List<string> validationFailures = new List<string>();

// trigger the model validation and add every error to the validationFailures list

if (validationFailures.Any())
{
return ValidateOptionsResult.Fail(validationFailures);
}

return ValidateOptionsResult.Success;
}
}
但不幸的是我不能这样做。调试器命中验证器,但如何在 Validate 方法中触发验证?

最佳答案

请查看评论,因为我的解决方案已经可用!

基于 Rodrigo Rodrigues answer我根据数据注释创建了自己的选项验证器

public sealed class OptionsValidator<TOptions> : IValidateOptions<TOptions> where TOptions : class
{
public ValidateOptionsResult Validate(string name, TOptions options)
{
ValidationContext validationContext = new ValidationContext(options);
List<ValidationResult> validationResults = new List<ValidationResult>();
bool noValidationErrorsOccured = Validator.TryValidateObject(options, validationContext, validationResults, true);

if (noValidationErrorsOccured) {
return ValidateOptionsResult.Success;
}

IEnumerable<string> validationFailures = validationResults.Select(validationResult => validationResult.ErrorMessage);

return ValidateOptionsResult.Fail(validationFailures);
}
}
因此,每当我想向 DI 容器添加验证器时,我都可以使用此扩展方法
public static IServiceCollection AddOptionsValidator<TOptions>(this IServiceCollection serviceCollection) where TOptions : class
=> serviceCollection.AddSingleton<IValidateOptions<TOptions>, OptionsValidator<TOptions>>();

关于c# - 如何在 IValidateOptions<T> 实现中触发模型验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67544514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com