You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kev/Drawer/DataValidator/Validator/SimpleDataValidator.cs

103 lines
3.1 KiB
C#

1 month ago
using System.Data;
using Validation.Core;
namespace Validation.Validator
{
/// <summary>
/// 简单校验类
/// </summary>
public class SimpleDataValidator : IDataValidator
{
private const int MaxValidationErrors = 100;
private readonly List<IValidationRule> rules = new List<IValidationRule>();
public void AddRule(IValidationRule rule)
{
rules.Add(rule ?? throw new ArgumentNullException(nameof(rule)));
}
/// <inheritdoc />
public void RemoveRule(string ruleName)
{
rules.RemoveAll(r => r.RuleName == ruleName);
}
/// <inheritdoc />
public IEnumerable<IValidationRule> GetRules() => rules.AsReadOnly();
/// <inheritdoc />
public ValidationResult Validate(DataTable dataTable)
{
return Validate(dataTable, rules);
}
/// <inheritdoc />
public ValidationResult Validate(DataTable dataTable, IEnumerable<IValidationRule> customRules)
{
var result = new ValidationResult { IsValid = true };
if (dataTable == null)
{
result.AddError(-1, "数据表不能为空");
return result;
}
foreach (var rule in customRules)
{
try
{
var ruleResult = rule.Validate(dataTable);
if (!ruleResult.IsValid)
{
result.IsValid = false;
result.Errors.AddRange(ruleResult.Errors);
}
result.Warnings.AddRange(ruleResult.Warnings);
}
catch (Exception ex)
{
result.AddError(-1, $"规则 '{rule.RuleName}' 执行异常: {ex.Message}");
}
}
return result;
}
public ValidationResult Validate(string[] headers, int rowIndex, object[] values, IEnumerable<IValidationRule> customRules)
{
var result = new ValidationResult { IsValid = true };
foreach (var rule in customRules)
{
try
{
var ruleResult = rule.Validate(headers, rowIndex, values);
if (!ruleResult.IsValid)
{
result.IsValid = false;
result.Errors.AddRange(ruleResult.Errors);
}
result.Warnings.AddRange(ruleResult.Warnings);
if (result.Errors.Count > MaxValidationErrors)
{
return result;
}
}
catch (Exception ex)
{
result.AddError(-1, $"规则 '{rule.RuleName}' 执行异常: {ex.Message}");
}
}
return result;
}
public ValidationResult Validate(string[] headers, int rowIndex, object[] values)
{
return Validate(headers, rowIndex, values, rules);
}
}
}