5

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

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

也就是说,这不是也让代码看起来比 C# 通常更冗长吗,有点像 T-SQL 有时……这不会导致代码的外观和感觉不一致吗?

简而言之,您如何看待 Fluent Validation,如果您喜欢它,您发现哪个库最适合它?到目前为止,我已经查看了http://tnvalidate.codeplex.com/http://fluentvalidation.codeplex.com/乍一看似乎或多或少是等效的...

谢谢。

4

3 回答 3

4

还有http://rulesengine.codeplex.com/ 它使用 fluent-interface helper 类向引擎添加规则(然后用于验证对象)。

支持组合,跨领域,条件,多语言等...

于 2011-09-26T09:26:12.650 回答
2

我自己偶然发现了类似的东西,我写得很精确,这样代码就不会那么冗长了。

我有自己的验证,我可以在其中执行以下操作:

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.");
}

在这种情况下,它并不那么明显,但是当您进行验证时,您可以有许多项目要验证,因此一个衬里变得更容易扫描并弄清楚验证在做什么。

你确实有第一次遇到我放在那里的第一个代码,你必须弄清楚发生了什么,但是一旦你克服了这一点,我认为一堆一个衬里比多个块更容易眼睛第二种方法会产生。

于 2010-07-11T13:35:05.260 回答
2

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

您建议的两者的区别在于验证被放入单独的验证类中。您可以创建并忘记验证类,它们由验证库自动发现。

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

使用您自己喜欢的本地化库(例如字符串表)添加对本地化的支持也很容易

public class StringTableProvider : ILanguagePrompts
{
    public string this[string modelName, string propertyName]
    {
        get { return Get(modelName, propertyName) ?? "[" + propertyName+ "]"; }
    }

    public string Get(string modelName, string propertyName)
    {
        return Resource1.ResourceManager.GetString(modelName + "_" + propertyName);
    }
}

并配置:

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.
}
于 2010-07-11T13:35:45.213 回答