流畅的validation和库

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

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

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

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

谢谢。

我正在使用我在这里发布的自己的validation库。

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

public class MyModelValidator : FluentValidator { 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(); 

实际validation是这样完成的:

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

还有http://rulesengine.codeplex.com/它使用一个流畅的接口助手类来向引擎添加规则(然后用于validation对象)。

支持合成,跨场,条件,多语言等…

我自己偶然发现了类似的东西,而且我写得恰到好处,因此代码很简洁。

我有自己的validation,我做的事情如下:

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

在这种情况下,它并不那么引人注目,但是当您进行validation时,您可以使用许多项进行validation,因此一个衬管变得更容易扫描并弄清楚validation的作用。

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