Fluent 验证处理异常
Fluent Validation Handle Exception
我在 AbstractValidator class 中定义了一些自定义规则,我希望当规则定义中存在内部异常(例如 NullReferenceException)时,验证过程 return 错误 集合。现在,当遇到异常时,验证停止并抛出该异常。
RuleFor(order => order.Products).Must(products =>
{
HashSet<string> domains = products
.SelectMany(product => product.Stock.Domains)
.Select(domain => domain.Name)
.ToHashSet();
return domains.Count >= distinctDomains;
}).When(order => order.Products.Count >= maxProductsCount)
例如当 Domains 属性 为 null 时,抛出异常并停止验证。我希望验证过程继续,并以某种方式附加 Errors 集合(来自 ValidationException)中发生的事情。
是否有任何选项可以实现这种行为?
我还没有机会自己测试这个,但你应该能够在 Must 验证器中捕获异常,然后将规则消息(使用当前上下文)设置为异常的错误消息(或其他任何内容)你要)。这使您无需使用 WithMessage 方法,只需在您的逻辑中设置消息即可。这将捕获异常并允许处理继续,但将异常消息作为错误。
类似于:
RuleFor(order => order.Products).Must((order, products, context) =>
{
try {
HashSet<string> domains = products
.SelectMany(product => product.Stock.Domains)
.Select(domain => domain.Name)
.ToHashSet();
return domains.Count >= distinctDomains;
}
catch (Exception ex) {
context.Rule.MessageBuilder = c => ex.Message;
return false;
}
}).When(order => order.Products.Count >= maxProductsCount)
我在 AbstractValidator class 中定义了一些自定义规则,我希望当规则定义中存在内部异常(例如 NullReferenceException)时,验证过程 return 错误 集合。现在,当遇到异常时,验证停止并抛出该异常。
RuleFor(order => order.Products).Must(products =>
{
HashSet<string> domains = products
.SelectMany(product => product.Stock.Domains)
.Select(domain => domain.Name)
.ToHashSet();
return domains.Count >= distinctDomains;
}).When(order => order.Products.Count >= maxProductsCount)
例如当 Domains 属性 为 null 时,抛出异常并停止验证。我希望验证过程继续,并以某种方式附加 Errors 集合(来自 ValidationException)中发生的事情。
是否有任何选项可以实现这种行为?
我还没有机会自己测试这个,但你应该能够在 Must 验证器中捕获异常,然后将规则消息(使用当前上下文)设置为异常的错误消息(或其他任何内容)你要)。这使您无需使用 WithMessage 方法,只需在您的逻辑中设置消息即可。这将捕获异常并允许处理继续,但将异常消息作为错误。
类似于:
RuleFor(order => order.Products).Must((order, products, context) =>
{
try {
HashSet<string> domains = products
.SelectMany(product => product.Stock.Domains)
.Select(domain => domain.Name)
.ToHashSet();
return domains.Count >= distinctDomains;
}
catch (Exception ex) {
context.Rule.MessageBuilder = c => ex.Message;
return false;
}
}).When(order => order.Products.Count >= maxProductsCount)