Каковы хорошие / стандартные способы распространения ошибок проверки целостности данных для пользователя? - PullRequest
1 голос
/ 09 апреля 2011

Я разрабатываю управляемое данными веб-приложение с использованием ASP.Net MVC 3. Я буду использовать NHibernate для доступа к данным, но мой вопрос не зависит от языка (относится ко всем языкам, которые имеют концепцию исключения).

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

Вопрос

Я думаю, что мне, вероятно, следует заключить указанную проверку в мои реализации IRepository. Использование, например, пользовательского атрибута проверки MVC для запроса к базе данных на проверку неестественно, на мой взгляд; такая обработка кажется лучше оставить где-то еще.

Если я выполню свою проверку в реализациях IRepository, как мне распространить ее в вызывающий контекст?

Я вижу несколько вариантов:

  • Подкласс Exception с чем-то вроде ValidationException (или, если он уже существует). Предоставьте сообщение USER FRIENDLY в качестве свойства Message.

Вышеприведенное легко реализовать, но предполагается, что вызывающий контекст хочет отобразить текст для пользователя. Кроме того, вызывающему контексту сложно обеспечить локализацию (я полагаю, что нет места в исключении - я ненавижу пытаться переводить перед поиском в Google!).

  • То же, что и выше, но вместо текстового сообщения укажите ValidationException<ValidationEnum>, где ValidationEnum - это Enum, который описывает ошибку для предметной модели.

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

Есть ли другие варианты, кроме тех, которые более красивы?

1 Ответ

1 голос
/ 09 апреля 2011

В зависимости от архитектуры, вариант IDataErrorInfo для типов вашего домена может быть вариантом;это позволяет вам указывать сбой как на уровне объекта, так и на уровне объекта + члена, а IIRC теперь также обрабатывает это автоматически в MVC (ряд других сред, таких как winforms и т. д., поддерживают это целую вечность).

...