[英]FluentValidation: Comparing a value with an aggregate of values?
當為單個類的屬性制定簡單規則時,我發現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
? 這是一個存根(盡管我不確定Must()
是不是要走的路):
public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
public PurchaseOrderValidator()
{
RuleFor(x => x.Total).Must(MatchSumOfLineItems);
}
private bool MatchSumOfLineItems(decimal arg)
{
return true;
}
}
只需創建將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);
}
}
或者,如果您要為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);
}
}
為什么不使用.Equal()
public class PurchaseOrderValidator : AbstractValidator<PurchaseOrder>
{
public PurchaseOrderValidator()
{
RuleFor(x => x.Total).Equal(x => x.LineItems.Sum(item => item.Price));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.