У меня есть несколько разных классов с свойством Name типа string
, но правила для проверки имени в каждом случае одинаковы, например. не должно быть нулевым, от 1 до 32 символов, не должно содержать некоторые недопустимые/символьные символы и т. д. - вы получаете идею.Как создать пользовательский флажок FluentValidation PropertyValidator с конкретными сообщениями об ошибках проверки?
Я использую библиотеку FluentValidation для моей проверки. Я очень новичок в этом, но, как я уже видел. Я начал с создания AbstractValidator<T>
производных классов валидации для каждого класса в моей объектной модели для проверки их свойств. Я быстро понял, что я дублировал код для проверки свойств имени различных классов, поэтому решил создать валидатор специальных свойств NameValidator
(т. Е. Собственный класс PropertyValidator
). Цель заключалась в том, чтобы инкапсулировать четыре или пять частей повторяющейся логики проверки имени в одном месте.
Что мне не нравится в этом решении, однако (на основе моего понимания новичков) заключается в том, что я не могу указать другое конкретное сообщение об ошибке проверки на основе критериев, для которых проверка не выполняется, поскольку сообщение об ошибке должно быть определенный в конструкторе и переданный базовому классу. Другими словами, сообщение об ошибке проверки привязано к типу класса, а не логике времени выполнения в пределах переопределения IsValid(...)
. Например, если имя слишком длинное, я хотел бы предоставить конкретное сообщение, говорящее как таковое, а не сложное сообщение, в котором говорится, что проверка не выполнена по одной из нескольких возможных причин и позволяет пользователю выяснить, какой из них был реальным виновник. Возможно, это возможно как-то, и я просто пропустил его, или, возможно, валидатор свойств просто не предназначен для поддержки понятия нескольких типов проверки.
Следующий подход я считал, было создать NameValidator
класс, производный от AbstractValidator<string>
и использует различные RuleFor
высказывания вида: RuleFor(name => name).Foo(...)
и т.д., которые облегчают определение конкретных сообщений об ошибках валидации. Однако это «неправильно», потому что AbstractValidator<T>
предназначен для проверки объекта, тогда как PropertyValidator
предназначен для проверки свойств. Любые мысли/рекомендации относительно действительности (или иного) этого подхода были бы оценены.
Так что мой вопрос в том, что является рекомендуемым способом инкапсуляции различных частей логики валидации свойств вместе в многоразовом режиме с использованием библиотеки FluentValidation, сохраняя при этом возможность предоставлять очень конкретные сообщения об ошибках проверки, точно описывающие, почему что-то не удалось проверить?
Спасибо Раджу за мотивированный ответ. Я согласен с вашими рассуждениями. Тем не менее, я заметил два неудачных побочных эффекта, исходя из подхода «AbstractValidator». Во-первых, возвращаемое значение в 'ValidationFailure.PropertyName' теперь является« Name.Name », а не просто« Name ». Другое заключается в том, что встроенный валидатор «NotNull <>» больше не работает (но другие делают, например, «Длина <>»). Это вызывает у меня озабоченность тем, что к этому подходу могут быть и другие неизвестные и непреднамеренные последствия. –
prlc
Я просто наткнулся на этот вопрос/ответ на тесно связанную тему на странице проекта GitHub FluentValidation: [link] (https://github.com/JeremySkinner/FluentValidation/issues/184).Джереми Скиннер (автор/архитектор библиотеки FluentValidation) в основном говорит, что создание «AbstractValidator» не рекомендуется и имеет известные проблемы, поэтому моя оригинальная проблема/вопрос остается. –
prlc
В основном проблема существует только с примитивным типом. Поэтому, если вы должны были создать класс Name, в котором содержится строка, то вы можете использовать AbstractValidator. Вы пробовали этот подход? –