Свободная проверка и библиотеки - PullRequest
5 голосов
/ 11 июля 2010

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

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

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

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

Спасибо.

Ответы [ 3 ]

4 голосов
/ 26 сентября 2011

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

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

2 голосов
/ 11 июля 2010

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

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

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 голосов
/ 11 июля 2010

Я наткнулся на что-то подобное самостоятельно и написал это точно, чтобы код был МЕНЬШЕ подробным.

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

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

В этом контексте это не так заметно, но когда вывыполнить валидацию, вы можете иметь МНОГИЕ элементы для проверки, так что один вкладыш станет намного проще сканировать и выяснить, что делает проверка.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...