【发布时间】:2014-09-28 23:04:45
【问题描述】:
我查询远程服务以一次接收一批 100 件产品,并继续执行此操作,直到没有更多批次剩余。我将这 100 种产品重新映射到我自己的产品对象,我希望一次验证并保存到数据库中。如果没有验证,我会记录错误并继续其余的。处理完前 100 个后,我会去获取下一批 100 个。总共大约 5000 个。
在分析我的网站后,我看到的问题是 Validator.TryValidateObject 似乎以指数方式运行的时间越来越长。第一批 1000 用时 10 分钟,第二批 1000 用时 20 分钟,第三批 1000 用时 30 分钟。所以每次似乎要多花 10 分钟。
Product 类有一个伙伴类 ProductValidation,其中包含用于验证的适当数据注释。我调用 product.IsValid()。
public class Product{
public bool IsValid()
{
return this.IsValid<Product, ProductValidation>();
}
}
使用以下代码:
public static bool IsValid<T, U>(this T obj)
{
if (typeof(T) != typeof(U))
{
TypeDescriptor.AddProviderTransparent(new AssociatedMetadataTypeTypeDescriptionProvider(typeof(T), typeof(U)), typeof(T));
}
var validationContext = new ValidationContext(obj, null, null);
var validationResults = new List<ValidationResult>();
//The line below slows everything down. If commented out all is fine
Validator.TryValidateObject(obj, validationContext, validationResults, true);
if (validationResults.Count > 0)
return false;
else
return true;
}
为什么上述情况会呈指数级放缓?就像验证器每次都在重新验证所有对象一样。
【问题讨论】:
-
尝试为每对类型只调用一次
AddProviderTransparent。
标签: c# asp.net-mvc validation