流畅的验证和库

时间:2010-07-11 12:44:13

标签: c# .net validation fluent

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

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

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

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

感谢。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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.");
}

在这种情况下,它并不那么引人注目,但是当您进行验证时,您可以使用许多项进行验证,因此一个内容变得更容易扫描并找出验证正在进行的操作。

你第一次遇到我在那里遇到的第一个代码,你必须弄清楚发生了什么,但是一旦你超越了它,我认为一堆衬里比一些衬里更容易第二种方法将产生的多个块。

答案 2 :(得分:2)

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

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

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.
}