验证:流利验证与反思 - 最佳实践/绩效

时间:2017-08-24 17:04:23

标签: c# performance validation reflection fluentvalidation

我有一个清单应用程序,它使用安装在计算机上的代理来读取一些信息并将其传递给服务器以进行进一步处理。此外,它将存储在数据库中。

现在我想知道有关该信息的验证(如计算机名称,操作系统,已安装的软件等)。

我确实想要在代理端预先验证数据,以避免将数据发送到可能损害数据库或后续处理类并导致错误的服务器。 当然,我也会在服务器端验证数据,以防止任何人向服务器发送有害代码。 因此,我不需要对代理进行超精确验证。

另外,要了解验证错误,必须以某种方式将数据发送到服务器,但我想确保我知道这一点,因此可以首先以不同的方式处理它。我的计划是将它发送到只将其存储在日志文件中的服务器进行进一步分析。

我偶然发现了反射,发现我可以在标记的答案中使用一小段代码来验证所有整数,字符串等对正则表达式:

Automate the validation process on properties using FluentValidation Library

public class Validator<T> : AbstractValidator<T>
{
public Validator(Func<PropertyInfo, bool> filter) {
    foreach (var propertyInfo in typeof(T)
        .GetProperties()
        .Where(filter)) {
        var expression = CreateExpression(propertyInfo);
        RuleFor(expression).NotEmpty();
    }
}

private Expression<Func<T, object>> CreateExpression(PropertyInfo propertyInfo) {
    var parameter = Expression.Parameter(typeof(T), "x");
    var property = Expression.Property(parameter, propertyInfo);
    var conversion = Expression.Convert(property, typeof(object));
    var lambda = Expression.Lambda<Func<T, object>>(conversion, parameter);

    return lambda;
}
}

And it can be used as such:

private static void ConfigAndTestFluent()
{
    CustomerDto customer = new CustomerDto();
    Validator<CustomerDto> validator = new Validator<CustomerDto>(x=>x.Name!="Remarks"); //we specify here the matching filter for properties
    ValidationResult results = validator.Validate(customer);
}

我会使用它来区分字符串/整数等并完成。 但我读到反射速度非常慢,应该尽可能避免。

按照JeremySkinner的FluentValidation手册,我会做一些他在这里展示的事情:

https://github.com/JeremySkinner/FluentValidation/wiki

using FluentValidation;

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
   RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please     specify a first name");
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer =>     customer.HasDiscount);
RuleFor(customer => customer.Address).Length(20, 250);
RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
// custom postcode validating logic goes here
  }
    }

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;

然后迭代每个错误,重新检查属性类型以及应用于将其发送回服务器的规则。 缺点是我必须为每一个属性做验证规则,我认为这是最好的做法,但也是更多的工作。

我没有找到任何明确的答案,或者我只是不明白,所以我想请求一些意见和帮助。速度实际上不是问题,但我想知道我在做什么,以及我可能会牺牲这样做。

因此,我的问题:

  • 在我的案例中,验证的最佳做法是什么?
  • 我应该走很长的路线,分别验证每个物业吗?
  • 有没有其他方法可以实现可能更好的相同目标?

非常感谢任何帮助。

谢谢:)

0 个答案:

没有答案