【发布时间】:2014-11-30 12:08:48
【问题描述】:
我正在使用 FluentValidation 来验证一个对象,因为这个对象有一个集合成员,所以我正在尝试使用 RuleForEach。例如,假设我们有 Customer 和 Orders,并且我们希望确保没有客户订单的总价值超过该客户允许的最大值:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
到目前为止,一切都很好。但是,我还需要记录有关错误上下文的其他信息(例如,在数据文件中发现错误的位置)。我发现使用 FluentValidation 很难实现这一点,到目前为止,我最好的解决方案是使用 WithState 方法。例如,如果我发现客户的地址详细信息不正确,我可能会这样做:
this.RuleFor(customer => customer.Address)
.Must(...)
.WithState(customer => GetErrorContext(customer.Address))
(其中GetErrorContext是我提取相关细节的一种方法。
现在我遇到的问题是,当使用 RuleForEach 时,方法签名假定我将提供一个引用 Customer 的表达式,而不是导致验证失败。而且我似乎无法判断哪个订单有问题。因此,我无法存储适当的上下文信息。
换句话说,我只能这样做:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
.WithState(customer => ...)
...当我真的想这样做时:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
.WithState(order => ...)
真的没有办法访问失败的集合项的详细信息(甚至是索引)吗?
我想另一种看待它的方式是我希望 WithState 有一个等效的 WithStateForEach...
【问题讨论】:
标签: c# validation fluentvalidation