Gus*_*ren 2 c# fluentvalidation
当我为单个类的属性制定简单规则时,我发现 FluentValidation 很简单,但是一旦我需要比较集合中的值(例如属性List<T>),它就会变得非常棘手。假设以下两个最小类:
public class PurchaseOrder
{
public List<LineItem> LineItems { get; set; }
public decimal Total { get; set; }
public PurchaseOrder()
{
LineItems = new List<LineItem>();
}
}
public class LineItem
{
public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
还有这个类:
class Program
{
static void Main(string[] args)
{
PurchaseOrder order = new PurchaseOrder();
order.LineItems.Add(new LineItem() { Price = 12m });
order.LineItems.Add(new LineItem() { Price = 14m });
order.Total = 26m;
PurchaseOrderValidator validator = new PurchaseOrderValidator();
ValidationResult result = validator.Validate(order);
}
}
Run Code Online (Sandbox Code Playgroud)
PurchaseOrderValidator确保所有的总和LineItem.Price等于会是什么样子PurchaseOrder.Total?这是一个存根(尽管我不确定Must()这是正确的方法):
public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
public PurchaseOrderValidator()
{
RuleFor(x => x.Total).Must(MatchSumOfLineItems);
}
private bool MatchSumOfLineItems(decimal arg)
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不使用.Equal()
public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
public PurchaseOrderValidator()
{
RuleFor(x => x.Total).Equal(x => x.LineItems.Sum(item => item.Price));
}
}
Run Code Online (Sandbox Code Playgroud)
只需创建作为输入的验证方法PurchaseOrder并用它做任何你想做的事情
public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
public PurchaseOrderValidator()
{
RuleFor(x => x).Must(MatchSumOfLineItems);
}
private bool MatchSumOfLineItems(PurchaseOrder arg)
{
return arg.Total == arg.LineItems.Sum(i => i.Price);
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想专门为Total属性添加验证,您可以使用另一个Must重载接受Func<decimal, PurchaseOrder, bool>
public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
public PurchaseOrderValidator()
{
RuleFor(x => x.Total).Must(MatchSumOfLineItems);
}
private bool MatchSumOfLineItems(PurchaseOrder order, decimal sum)
{
return sum == order.LineItems.Sum(i => i.Price);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2123 次 |
| 最近记录: |