Skip to main content
 首页 » 编程设计

c#之FluentValidation:将值与值的集合进行比较

2024年01月29日26del

在为单个类的属性制定简单规则时,我发现 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; } 
} 

这个类:

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); 
    } 
} 

如何PurchaseOrderValidator看起来要确保所有 LineItem.Price 的总和等于 PurchaseOrder.Total ?这是一个 stub (虽然我不确定 Must() 是要走的路):

public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder> 
{ 
    public PurchaseOrderValidator() 
    { 
        RuleFor(x => x.Total).Must(MatchSumOfLineItems); 
    } 
 
    private bool MatchSumOfLineItems(decimal arg) 
    { 
        return true; 
    } 
} 

请您参考如下方法:

为什么不使用.Equal()

public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder> 
{ 
    public PurchaseOrderValidator() 
    { 
        RuleFor(x => x.Total).Equal(x => x.LineItems.Sum(item => item.Price)); 
    } 
}