При поиске чего-то полностью различного на днях, я наткнулся на две библиотеки для того, чтобы сделать Быструю Проверку в.NET. Понятие кажется интересным с тех пор до сих пор, я делаю свои проверки с помощью обычного условного выражения и переходящих операторов (если, еще, случай, и т.д.).
В особенно, это делает относительно легким объединить в цепочку некоторые условия, которые могли привести в некоторых случаях к более короткому коду для сложных условий, и встроить несколько сообщений об ошибках для каждого нарушения в том же объекте.
Тем не менее разве это не также создание взгляда кода, более подробного, чем C# обычно, немного как T-SQL может быть время от времени..., и разве это не заставляет код иметь непоследовательный стиль?
Короче говоря, что Вы думаете о Быстрой Проверке и если Вам нравится она, какую библиотеку Вы нашли, чтобы быть лучшими для нее? До сих пор у меня есть рассмотрение http://tnvalidate.codeplex.com/ и http://fluentvalidation.codeplex.com/, который кажется более или менее эквивалентным на первый взгляд...
Спасибо.
Я использую свою собственную библиотеку валидации, которую я опубликовал здесь.
Разница с двумя предложенными вами в том, что валидации помещены в отдельные классы валидаций. Вы можете создать классы валидации и забыть о них, они автоматически обнаруживаются библиотекой валидации.
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.
}
Я сам наткнулся на нечто подобное, и написал это именно для того, чтобы код был менее многословным.
У меня есть своя валидация, где я делаю такие вещи, как:
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.");
}
В этом контексте это не так заметно, но когда вы делаете валидацию, у вас может быть МНОГО элементов для валидации, поэтому однострочники становятся намного проще для сканирования и выяснения того, что делает валидация.
В первый раз вы действительно столкнетесь с первым кодом, который я там разместил, и вам придется понять, что происходит, но когда вы это пройдете, я думаю, что куча однострочников легче для глаз, чем многочисленные блоки, которые выдает второй метод.