C# Fluent验证和库

C# Fluent验证和库,c#,.net,validation,fluent,C#,.net,Validation,Fluent,前几天在寻找完全不同的东西时,我偶然发现了两个在.NET中进行流畅验证的库。 这个概念似乎很有趣,因为到目前为止,我使用常用的条件语句和分支语句(if、else、case等)进行验证 特别是,它可以相对容易地链接某些条件(在某些情况下可能导致复杂条件的代码更短),并在同一对象中为每个违规嵌入多条错误消息 这就是说,这不是也让代码看起来比C语言更冗长吗?通常情况下,有时有点像t-SQL。。。这难道不会导致代码的外观不一致吗 简言之,您如何看待Fluent验证?如果您喜欢,您发现哪个库最适合它?到目

前几天在寻找完全不同的东西时,我偶然发现了两个在.NET中进行流畅验证的库。 这个概念似乎很有趣,因为到目前为止,我使用常用的条件语句和分支语句(if、else、case等)进行验证

特别是,它可以相对容易地链接某些条件(在某些情况下可能导致复杂条件的代码更短),并在同一对象中为每个违规嵌入多条错误消息

这就是说,这不是也让代码看起来比C语言更冗长吗?通常情况下,有时有点像t-SQL。。。这难道不会导致代码的外观不一致吗

简言之,您如何看待Fluent验证?如果您喜欢,您发现哪个库最适合它?到目前为止,我已经看到了和第一眼看上去差不多的东西


谢谢。

我自己偶然发现了类似的东西,我写的正是这样,代码就不会那么冗长了

我有自己的验证,我做了如下事情:

Validation.IsNullOrEmpty(m => m.FirstName, modelState);
Validation.Validate(m => m.ZipCode, z => z.Length == 5, modelState, 
"ZipCode must be 5 characters long");
现在,这与我使用的MVC体系结构密切相关,但我发现这比:

if (string.IsNullOrEmpty(FirstName))
{
  ModelState.AddError("FirstName", "FirstName cannot be empty.");
}
在这种情况下,它并不那么明显,但是当您进行验证时,您可以有许多项要验证,因此一行程序变得更容易扫描并了解验证在做什么


你确实有第一次遇到我放在那里的第一个代码,你必须弄清楚发生了什么,但是一旦你过去了,我认为一堆一行代码比第二种方法产生的多个代码块更容易理解。

我正在使用我自己发布的验证库

与您建议的两个不同之处在于,验证被放在单独的验证类中。您可以创建和忘记验证类,它们由验证库自动发现

public class MyModelValidator : FluentValidator<MyModel>
{
  public MyModelValidator()
  {
    Property("FirstName").Required();
    Property("LastName").Required().Min(15);
  }
}
并配置:

Validator.LanguageHandler = new StringTableProvider();
实际验证如下所示:

User user = new User();
user.FirstName = "Jonas";

var errors = Validator.Validate(user);
if (errors.Count > 0)
{
    // Handle the errors in any way you like.
    // both property names (localized and actual property name) and localized error message is accessible.
}
还有 它使用fluent接口助手类向引擎添加规则(然后用于验证对象)

支持组合、跨域、条件、多语言等

User user = new User();
user.FirstName = "Jonas";

var errors = Validator.Validate(user);
if (errors.Count > 0)
{
    // Handle the errors in any way you like.
    // both property names (localized and actual property name) and localized error message is accessible.
}