如何仅针对部分RuleSets扩展FluentValidation验证规则?
FluentValidation避免重复规则的解决办法
你遇到的核心问题是不想重复写PartialKey的基础约束,同时要在添加操作时额外校验唯一键。这里有两个实用方案:
方案1:把基础规则抽出来复用
把PartialKey的基础校验逻辑单独封装成方法,不管是默认RuleSet还是"Adding" RuleSet,直接调用这个方法就行,不用重复写代码:
public class MyValidator : AbstractValidator<Model> { public MyValidator() { // 默认RuleSet:只执行基础约束 RuleFor(model => model.PartialKey).SetValidator(GetPartialKeyBasicRules()); // Adding RuleSet:基础约束 + 唯一键校验 RuleSet("Adding", () => { RuleFor(model => model.PartialKey) .SetValidator(GetPartialKeyBasicRules()) .MustNotExistUniqueComposeKey(); }); } // 提取基础规则到私有方法,哪里需要哪里调 private IValidator<string> GetPartialKeyBasicRules() { return new InlineValidator<string>() .MustMeetBasicConstraints(); } }
方案2:通过验证上下文动态判断RuleSet
不用单独写"Adding" RuleSet里的重复规则,直接在默认规则上通过When判断当前执行的RuleSet是否包含"Adding",如果是就自动加上唯一键校验:
public class MyValidator : AbstractValidator<Model> { public MyValidator() { RuleFor(model => model.PartialKey) .MustMeetBasicConstraints() // 只要当前执行的RuleSet包含"Adding",就触发唯一键校验 .MustNotExistUniqueComposeKey() .When((model, context) => context.RuleSets.Contains("Adding"), ApplyConditionTo.CurrentValidator); } }
调用注意
执行验证时,指定要包含的RuleSet为"Adding"就行,FluentValidation默认会同时执行默认RuleSet(如果不想执行默认RuleSet,可以加options.SkipDefaultRuleSet = true):
var validator = new MyValidator(); var result = validator.Validate(model, options => options.IncludeRuleSets("Adding"));
这样既保证基础约束始终生效,添加操作时自动触发额外校验,还完全避免了重复代码。
内容的提问来源于stack exchange,提问作者Bartosz Domżalski
相关产品推荐
相关产品推荐

