打开网络研讨会“将流动性验证作为数据验证工具”



你好! 作为C#Developer课程启动的一部分我们举办了有关Fluent Validation工具传统公开课 在网络研讨会上,我们通过检查填充客户数据正确性的示例研究了如何消除大量ifs,研究了库的内部实现以及如何将Fluent接口方法付诸实践。 该网络研讨会由YouDo团队负责人Alexei Yagur主持。



为什么需要验证?


维基百科告诉我们验证 (来自Validus的“健康,强大,强大”)可以证明特定用户,产品,服务或系统的要求得到满足。 通常,在对指定的使用条件进行分析并评估产品特性是否符合现有要求的前提下,根据需要进行验证。 验证的结果是关于在特定条件下使用该产品的可能性的结论。

至于Fluent Validation工具,他的知识将使我们能够:

  • 节省解决数据验证相关任务的时间;
  • 将分散的自制支票统一化;
  • 向同事炫耀您的咖啡验证知识:)

但这只是理论,让我们更好地练习。

案例研究验证:交互式


因此,C#中验证的实际实现如下:



我们有一个Customer类,它具有最简单的字段集:FirstName-名称,LastName-姓氏,Age-年龄。 正如我们所见,有一个CustomerManager类可以在CustomerRepository中保存一个新用户(买方),并向控制台显示已成功添加客户的信息。

让我们尝试添加一个自定义项和一个将管理该自定义项的经理:

void Main() { var customer = new Customer { FirstName = " ", LastName = "", Age = 57, }; var manager = new CustomerManager(); manager.Add(customer); } 

执行的结果将是控制台中以下文本的输出:

.

如您所见,到目前为止一切顺利。 但是,如果“损坏的”数据突然出现在我们的数据库中会发生什么。 例如,如果在字段中输入了不正确的信息(电话号码而不是姓名,带有减号的年龄等):

 { FirstName = "+79123456789", LastName = "valde@mar.ru", Age = -14, }; 

结果,我们将看到还将添加一个具有难以理解的数据集的定制仪表:

+79123456789 valde@mar.ru .

自然,我们不想在我们的存储库中有这样的数据。 我们如何保护自己? 最简单的选择是,例如,如果我们没有所有字符-字母,则返回错误 。 为此,我们使用if设置FirstName的条件,如果不满足条件,则使用return停止该函数,并在控制台上显示消息“名称错误”。 我们对LastName也是如此。 至于年龄,我们在这里检查数字范围,例如:

if (customer.Age < 14 || customer.Age > 180)

现在假设我们需要为买方添加其他字段 ,例如电话。 我们将使用以下条件验证电话:输入的值必须以“ +79”开头,并且仅包含数字。 所有这些本身将是一个相当麻烦的设计,但是如果我们要添加更多电子邮件呢?

无论如何,执行完上述操作后,我们得到了一堆ifs和一大堆代码 。 对于外部开发人员来说,理解这样的代码并不容易。 怎么办

连接流利验证


LINQPad能够连接Fluent Validation库, 我们可以这样做 。 另外,我们创建另一个类CustomerValidator,它将成为一个验证器。 因此,我们在其中规定了所有必要的规则。 我们进行了其他调整,并删除了多个if,因为不再需要它们。

结果,我们的最终代码将如下所示:

 void Main() { var customer = new Customer { FirstName = "Alex2", LastName = "Petrov1", Age = 10, Phone = "+791234567893", Email = "adsf@fadsf3.com" }; var manager = new CustomerManager(); manager.Add(customer); } class Customer { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } public string Phone { get; set; } public string Email { get; set; } } class CustomerManager { CustomerRepository _repository; CustomerValidator _validator; public CustomerManager() { _repository = new CustomerRepository(); _validator = new CustomerValidator(); } public void Add(Customer customer) { if (!ValidateCustomer(customer)) { return; } _repository.Add(customer); Console.WriteLine($" {customer.FirstName} {customer.LastName}  ."); } private bool ValidateCustomer(Customer customer) { var result = _validator.Validate(customer); if (result.IsValid) { return true; } foreach(var error in result.Errors) { Console.WriteLine(error.ErrorMessage); } return false; } } class CustomerValidator : AbstractValidator<Customer> { public CustomerValidator() { var msg = "   {PropertyName}:  {PropertyValue}"; RuleFor(c => c.FirstName) .Must(c => c.All(Char.IsLetter)).WithMessage(msg); RuleFor(c => c.LastName) .Must(c => c.All(Char.IsLetter)).WithMessage(msg); RuleFor(c => c.Age) .GreaterThan(14).WithMessage(msg) .LessThan(180).WithMessage(msg); RuleFor(c => c.Phone) .Must(IsPhoneValid).WithMessage(msg) .Length(12).WithMessage("    {MinLength}  {MaxLength}.  : {TotalLength}"); RuleFor(c => c.Email) .NotNull().WithMessage(msg) .EmailAddress(); } private bool IsPhoneValid(string phone) { return !(!phone.StartsWith("+79") || !phone.Substring(1).All(c => Char.IsDigit(c))); } } class CustomerRepository { Random _random; public CustomerRepository() { _random = new Random(); } public void Add(Customer customer) { var sleepInSeconds = _random.Next(2, 7); Thread.Sleep(1000 * sleepInSeconds); } } 

还有一点理论


我想谈一谈Fluent Validation。 由于“流体”界面,因此以这种方式调用该工具。 再次,Wikipedia 告诉我们 ,流畅的接口是实现面向对象的API的一种方式,旨在提高程序源代码的可读性。 正如我们所看到的,定义包含许多优美而冗长的词,但并不总是很清楚。 但是我们可以这样说:
“流体接口是一种实现面向对象的API的方式,其中方法返回与调用它们时相同的接口。”
阿列克谢·亚古尔(Alexey Yagur)
至于库本身,它包括以下组件

  1. 基本逻辑 。 这是GitHub链接 ,您可以在其中查看主要逻辑。
  2. 辅助逻辑FluentValidation.ValidatorAttribute负责此逻辑。
  3. 上下文敏感部分请参见FluentValidation.AspNetCoreFluentValidation.Mvc5FluentValidation.WebApi
  4. 测试 。 因此,我们对FluentValidation.Tests.AspNetCoreFluentValidation.Tests.Mvc5FluentValidation.Tests.WebApiFluentValidation.Tests感兴趣

仅此而已,逐步编写代码,请观看视频 。 此外,您可能对教师在网络研讨会临近尾声举行的主题为“错误文本中的变量”的其他交互感兴趣。

C#开发人员课程中见!

Source: https://habr.com/ru/post/zh-CN472604/


All Articles