2016-01-06 2 views
0

У меня есть несколько разных классов с свойством Name типа string, но правила для проверки имени в каждом случае одинаковы, например. не должно быть нулевым, от 1 до 32 символов, не должно содержать некоторые недопустимые/символьные символы и т. д. - вы получаете идею.Как создать пользовательский флажок FluentValidation PropertyValidator с конкретными сообщениями об ошибках проверки?

Я использую библиотеку FluentValidation для моей проверки. Я очень новичок в этом, но, как я уже видел. Я начал с создания AbstractValidator<T> производных классов валидации для каждого класса в моей объектной модели для проверки их свойств. Я быстро понял, что я дублировал код для проверки свойств имени различных классов, поэтому решил создать валидатор специальных свойств NameValidator (т. Е. Собственный класс PropertyValidator). Цель заключалась в том, чтобы инкапсулировать четыре или пять частей повторяющейся логики проверки имени в одном месте.

Что мне не нравится в этом решении, однако (на основе моего понимания новичков) заключается в том, что я не могу указать другое конкретное сообщение об ошибке проверки на основе критериев, для которых проверка не выполняется, поскольку сообщение об ошибке должно быть определенный в конструкторе и переданный базовому классу. Другими словами, сообщение об ошибке проверки привязано к типу класса, а не логике времени выполнения в пределах переопределения IsValid(...). Например, если имя слишком длинное, я хотел бы предоставить конкретное сообщение, говорящее как таковое, а не сложное сообщение, в котором говорится, что проверка не выполнена по одной из нескольких возможных причин и позволяет пользователю выяснить, какой из них был реальным виновник. Возможно, это возможно как-то, и я просто пропустил его, или, возможно, валидатор свойств просто не предназначен для поддержки понятия нескольких типов проверки.

Следующий подход я считал, было создать NameValidator класс, производный от AbstractValidator<string> и использует различные RuleFor высказывания вида: RuleFor(name => name).Foo(...) и т.д., которые облегчают определение конкретных сообщений об ошибках валидации. Однако это «неправильно», потому что AbstractValidator<T> предназначен для проверки объекта, тогда как PropertyValidator предназначен для проверки свойств. Любые мысли/рекомендации относительно действительности (или иного) этого подхода были бы оценены.

Так что мой вопрос в том, что является рекомендуемым способом инкапсуляции различных частей логики валидации свойств вместе в многоразовом режиме с использованием библиотеки FluentValidation, сохраняя при этом возможность предоставлять очень конкретные сообщения об ошибках проверки, точно описывающие, почему что-то не удалось проверить?

ответ

1

Если бы это был я, я бы использовал подход NameValidator : AbstractValidator<string>. Тот факт, что Name соответствует слишком многим требованиям, делает его самостоятельным объектом.

Также семантический PropertyValidator используется для представления к одному типу ограничения не один собственности объекта

+0

Спасибо Раджу за мотивированный ответ. Я согласен с вашими рассуждениями. Тем не менее, я заметил два неудачных побочных эффекта, исходя из подхода «AbstractValidator ». Во-первых, возвращаемое значение в 'ValidationFailure.PropertyName' теперь является« Name.Name », а не просто« Name ». Другое заключается в том, что встроенный валидатор «NotNull <>» больше не работает (но другие делают, например, «Длина <>»). Это вызывает у меня озабоченность тем, что к этому подходу могут быть и другие неизвестные и непреднамеренные последствия. – prlc

+0

Я просто наткнулся на этот вопрос/ответ на тесно связанную тему на странице проекта GitHub FluentValidation: [link] (https://github.com/JeremySkinner/FluentValidation/issues/184).Джереми Скиннер (автор/архитектор библиотеки FluentValidation) в основном говорит, что создание «AbstractValidator » не рекомендуется и имеет известные проблемы, поэтому моя оригинальная проблема/вопрос остается. – prlc

+0

В основном проблема существует только с примитивным типом. Поэтому, если вы должны были создать класс Name, в котором содержится строка, то вы можете использовать AbstractValidator . Вы пробовали этот подход? –

Смежные вопросы