在寻找一些完全不同的东西时,我偶然发现了两个用于在.NET中进行Fluent验证的库。 这个概念看起来很有趣,因为到目前为止,我正在使用通常的条件和分支语句进行验证(if,else,case等)。
特别是,它可以相对容易地链接某些条件,这些条件可能会导致某些情况在较短的代码中出现复杂条件,并为同一对象中的每个违规嵌入多个错误消息。
那就是说,是不是也让代码看起来比C#通常更冗长,有点像T-SQL有时候......而且这不会导致代码的外观和感觉不一致?
简而言之,您如何看待Fluent Validation,如果您喜欢它,您认为哪个库最适合它?到目前为止,我已经看到http://tnvalidate.codeplex.com/和http://fluentvalidation.codeplex.com/乍一看似乎或多或少等同......
感谢。
答案 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.
}