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.
103 lines
3.1 KiB
C#
103 lines
3.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|