使用http://fluentvalidation.codeplex.com/将验证规则与特定流程绑定的最佳实践是什么
目前我正在使用“规则集”功能将规则分组到不同的进程:
public class ObjAValidation: AbstractValidator<A>
{
public ObjAValidation()
{
RuleSet("ProcessA", () =>
{
RuleFor(x => ...);
RuleFor(x => ...);
});
RuleSet("ProcessB", () =>
{
RuleFor(x => ...);
RuleFor(x => ...);
});
}
}
然后验证使用:
var a = new A(){...};
IValidator<A> validator = new ObjAValidation();
var result = validator.Validate(a, ruleSet: "ProcessA");
这种方法有两个问题:
- 我不喜欢使用字符串作为进程名称。我想使用更强类型的方法。例如能够使用标记接口或属性。
- 在我的单元测试中,我无法设置 IValidator 的 Validate 方法,因为您不能在 Moq 中使用可选参数。
Mock<IValidator<A>> _mockValidator = new Mock<IValidator<A>>();
_mockValidator.Setup(x => x.Validate(new A(), ruleSet: "ProcessA"));
第二行生成运行时错误:表达式树可能不包含命名参数规范。如果你想将没有命名参数的 ruleSet 参数传递给 Validate 方法,你必须提供一个“IValidatorSelector 选择器”对象。但是这个接口没有记录。