FlutEntObjectValidator - это небольшая и простая библиотека проверки, которая предоставляет интерфейс свободного для конфигурации правила.
Библиотека предназначена для предоставления альтернативы проверке модели на основе атрибутов (обязательный Attribute, StringlengthAttribute и т. Д.).
Библиотека целевых .NET STANDART 1.0, .NET 4.0, .NET 4.5
Библиотека доступна как пакет Nuget.
Вот шаги, которые помогут вам настроить проверку в вашем приложении.
Перво -наперво, вам нужно решить, какую информацию вы хотели бы получить, когда определенная модель не прошел проверку.
Основные классы, которые предоставляют функциональность проверки:
Validator - возвращает логическое значение, которое указывает на проходящую валидацию или нет.Validator<TError> - Возвращает экземпляр ValidationResult<TError> , который содержит логическое значение, и коллекцию пользовательских объектов TError , которые точно покажут вам, какое из правил не прошло.После того, как вы решите, какой валидатор использовать, все, что вам нужно сделать, это унаследовать от него и добавить конфигурации, как так:
public class MyValidator : Validator
{
public MyValidator ( )
{
AddConfiguration ( new ProductDTOConfiguration ( ) ) ;
AddConfiguration ( new UserDTOConfiguration ( ) ) ;
}
} public class MyValidator : Validator < MyCustomError >
{
public MyValidator ( )
{
AddConfiguration ( new ProductDTOConfiguration ( ) ) ;
AddConfiguration ( new UserDTOConfiguration ( ) ) ;
}
}Это подводит нас к следующему шагу.
Чтобы настроить правила, за которыми должны следовать ваши объекты, вам необходимо создать классы конфигурации для каждого из типов, которые вы хотите проверить.
В зависимости от выбранного валидатора, все конфигурации наследуют от ValidationConfiguration<TObject> или ValidationConfiguration<TObject, TError> .
ValidationConfiguration<TObject> public class ProductDTOConfiguration : ValidationConfiguration < ProductDTO >
{
public ProductDTOConfiguration ( )
{
Property ( x => x . Title )
. IsRequired ( )
. HasRule ( x => x . Length <= 10 ) ;
}
}После выбора свойства вы можете свободно добавлять правила проверки.
Вы можете определить любые правила с помощью метода HasRule , но есть несколько предопределенных ярлыков, таких как IsRequired , доступные для всех объектов, и HasMinLength , HasMaxLength , HasLengthInRange , MatchesRegex , доступный только для струн.
Валидация происходит последовательно в порядке, в котором были определены правила, и возвращает false как только одно из правил не было принято, или true если все они пройдут.
ValidationConfiguration<TObject, TError> public class ProductDTOConfiguration : ValidationConfiguration < ProductDTO , MyCustomError >
{
public ProductDTOConfiguration ( )
{
Property ( x => x . Title )
. IsRequired ( ( ) => new MyCustomError ( "Title is required" ) )
. HasRule (
x => x . Length <= 10 ,
( ) => new MyCustomError ( "Title is too long" ) ) ;
}
}Настройка проверки, которая возвращает пользовательские ошибки в случае сбоев, немного сложнее.
После выбора свойства и определения правила вам теперь нужно добавить делегат, который будет использоваться для создания объекта ошибки, если правило не пройдет.
Проверка также происходит последовательно в порядке, в котором были определены правила, но если одно из правил не проходит, ошибка добавляется к результату, и проверка продолжается.
Вы можете настроить проверку, чтобы пропустить остальные правила для текущего свойства или для всего объекта, если конкретное правило не пройдет. Это может быть сделано путем передачи соответствующих дополнительных логических параметров stopValidationOnError и terminateValidationOnError в метод HasRule . Оба они ложны по умолчанию.
IsRequired Method всегда пропускает остальные правила для имущества, так как нам не нужно проверять другие правила, если свойство, например, равно NULL.
Правила сочетания, такие как IsRequired , HasMaxLength реализуются с помощью методов расширения, поэтому вы можете легко добавить свои собственные ярлыки в свой проект.
После настройки правил вы можете создать экземпляр вашего валидатора и использовать его везде, где вы хотите.
var res = validator . Validate ( obj ) ;Каждый валидатор раскрывает один публичный метод «проверка», который доступен через интерфейсы:
public interface IValidator < TError >
{
ValidationResult < TError > Validate < TObject > ( TObject target ) ;
}
public interface IValidator
{
bool Validate < TObject > ( TObject target ) ;
}Вот почему вы можете легко использовать его с помощью инъекции зависимостей:
services . AddSingleton < IValidator , MyValidator > ( ) container . Register < IValidator < MyCustomError > , MyValidator > ( Lifestyle . Singleton ) ;Все конфигурации загружаются и проверены во время создания экземпляра Validator, поэтому, на мой взгляд, лучше всего использовать его в качестве синглтона.
Этот проект лицензирован по лицензии MIT - для получения подробной информации см. Файл лицензии.
Способ, которым возникает конфигурация правила, был вдохновлен структурой Entity 6 и ее способом настройки отношений между сущностями.