Свободная проверка и библиотеки

На днях, ища что-то совершенно другое, я наткнулся на две библиотеки для выполнения Fluent Validation в .NET. Концепция кажется интересной, поскольку до сих пор я выполнял проверки, используя обычные условные операторы и операторы ветвления (if, else, case и т. д.).

В частности, относительно легко связать некоторые условия, что в некоторых случаях может привести к сокращению кода для сложных условий, и встроить несколько сообщений об ошибках для каждого нарушения в один и тот же объект.

Тем не менее, не делает ли это также то, что код выглядит более многословным, чем обычно C#, немного похоже на T-SQL временами... и не приводит ли это к тому, что код имеет непоследовательный внешний вид?

Короче говоря, что вы думаете о Fluent Validation и, если она вам нравится, какую библиотеку вы считаете лучшей для нее? До сих пор я просматривал http://tnvalidate.codeplex.com/ и http://fluentvalidation.codeplex.com/, которые на первый взгляд кажутся более или менее эквивалентными...

Спасибо.


person Kharlos Dominguez    schedule 11.07.2010    source источник


Ответы (3)


Я использую собственную библиотеку проверки, опубликованную здесь< /а>.

Разница с двумя, которые вы предложили, заключается в том, что проверки помещаются в отдельные классы проверки. Вы можете создать и забыть классы проверки, они автоматически обнаруживаются библиотекой проверки.

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.
}
person jgauffin    schedule 11.07.2010

Существует также http://rulesengine.codeplex.com/, который использует вспомогательный класс с плавным интерфейсом для добавления правил. в механизм (который затем используется для проверки объектов).

Поддерживает композицию, перекрестное поле, условное, многоязычное и т. д.

person Arnaud    schedule 26.09.2011

Я сам наткнулся на нечто подобное, и написал именно так, чтобы код был МЕНЕЕ многословным.

У меня есть собственная проверка, где я делаю такие вещи, как:

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

В этом контексте это не так заметно, но когда вы выполняете проверку, у вас может быть МНОЖЕСТВО элементов для проверки, поэтому однострочные становится намного легче сканировать и выяснять, что делает проверка.

У вас есть первый раз, когда вы сталкиваетесь с первым кодом, который я там разместил, и вам нужно выяснить, что происходит, но как только вы преодолеете это, я думаю, что куча одного вкладыша легче для глаз, чем несколько блоков второй метод будет производить.

person CubanX    schedule 11.07.2010