C#如何简便校验CosmosDbSettings类所有属性非空或非空字符串
方案1:使用.NET 内置数据注解 + 配置验证(最推荐)
这是.NET原生支持的方案,无需引入第三方依赖,还支持启动时校验,避免运行时才发现配置错误。
首先给CosmosDbSettings的属性添加数据注解:
using System.ComponentModel.DataAnnotations; public class CosmosDbSettings { [Required(AllowEmptyStrings = false)] public string Database { get; set; } [Required(AllowEmptyStrings = false)] public string Collection { get; set; } [Required(AllowEmptyStrings = false)] public string Instance { get; set; } [Required(AllowEmptyStrings = false)] public string Key { get; set; } }
如果你用.NET的选项模式注册配置,可直接在注册时开启验证:
// Program.cs 中注册配置 builder.Services.AddOptions<CosmosDbSettings>() .Bind(builder.Configuration.GetSection("DatabaseSettings")) .ValidateDataAnnotations() .ValidateOnStart(); // 应用启动时就执行校验,提前发现问题
如果是手动校验实例,可直接调用Validator类实现:
public bool CheckCosmosSettingsValid(CosmosDbSettings settings) { var validationContext = new ValidationContext(settings); var errorResults = new List<ValidationResult>(); // validateAllProperties设为true才会校验所有属性 return Validator.TryValidateObject(settings, validationContext, errorResults, validateAllProperties: true); }
如果需要获取具体哪个属性校验失败,遍历errorResults即可。
方案2:反射实现通用字符串属性校验
如果你的场景不适合用数据注解,或者需要通用校验逻辑适配多个配置类,可以用反射写扩展方法,一次编写所有字符串属性的配置类都能复用,后续新增属性也不用调整校验代码:
using System.Reflection; public static class ValidationExtension { public static bool AllStringPropertiesNotEmpty(this object obj) { // 先校验实例本身是否为空 if (obj == null) return false; // 取当前类所有公共字符串类型的实例属性 var stringProps = obj.GetType() .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.PropertyType == typeof(string)); foreach (var prop in stringProps) { var value = (string)prop.GetValue(obj); if (string.IsNullOrEmpty(value)) { // 这里如果需要可以抛出异常,或记录错误的属性名 return false; } } return true; } }
调用方式非常简单:
bool isValid = myClassInstance.DatabaseSettings.AllStringPropertiesNotEmpty();
方案3:FluentValidation 第三方库实现
如果项目已经引入了FluentValidation做校验,用这个方案可以和现有校验逻辑统一风格,后续如果要加更复杂的校验规则(比如Instance必须是合法URL、Key长度符合要求)也很方便扩展:
using FluentValidation; public class CosmosDbSettingsValidator : AbstractValidator<CosmosDbSettings> { public CosmosDbSettingsValidator() { RuleFor(x => x.Database).NotEmpty(); RuleFor(x => x.Collection).NotEmpty(); RuleFor(x => x.Instance).NotEmpty(); RuleFor(x => x.Key).NotEmpty(); } }
校验调用:
var validator = new CosmosDbSettingsValidator(); var validateResult = validator.Validate(myClassInstance.DatabaseSettings); bool isValid = validateResult.IsValid;
内容的提问来源于stack exchange,提问作者ZZZSharePoint
相关产品推荐
相关产品推荐

