代码之家  ›  专栏  ›  技术社区  ›  Kharlos Dominguez

Fluent验证和库

  •  5
  • Kharlos Dominguez  · 技术社区  · 15 年前

    前几天在寻找完全不同的东西时,我偶然发现了两个在.NET中进行Fluent验证的库。

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

    简而言之,你觉得Fluent验证怎么样?如果你喜欢,你发现哪个库最适合它?到目前为止,我一直在看 http://tnvalidate.codeplex.com/ http://fluentvalidation.codeplex.com/ 乍一看,似乎多少相当于。。。

    3 回复  |  直到 15 年前
        1
  •  2
  •   jgauffin    15 年前

    我正在使用我自己发布的验证库 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.
    }
    
        2
  •  4
  •   Arnaud    14 年前

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

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

        3
  •  2
  •   CubanX    15 年前

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

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

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

    推荐文章