Я разрабатываю управляемое данными веб-приложение с использованием ASP.Net MVC 3. Я буду использовать NHibernate для доступа к данным, но мой вопрос не зависит от языка (относится ко всем языкам, которые имеют концепцию исключения).
Я пришел к выводу, что лучше применять свои правила целостности данных как в реальной базе данных, так и в реализации репозитория для извлечения указанных данных, для обеспечения безопасности и в крайних случаях, когда предлагаемые механизмы целостности недостаточно гибки.
Вопрос
Я думаю, что мне, вероятно, следует заключить указанную проверку в мои реализации IRepository. Использование, например, пользовательского атрибута проверки MVC для запроса к базе данных на проверку неестественно, на мой взгляд; такая обработка кажется лучше оставить где-то еще.
Если я выполню свою проверку в реализациях IRepository, как мне распространить ее в вызывающий контекст?
Я вижу несколько вариантов:
- Подкласс
Exception
с чем-то вроде ValidationException
(или, если он уже существует). Предоставьте сообщение USER FRIENDLY в качестве свойства Message.
Вышеприведенное легко реализовать, но предполагается, что вызывающий контекст хочет отобразить текст для пользователя. Кроме того, вызывающему контексту сложно обеспечить локализацию (я полагаю, что нет места в исключении - я ненавижу пытаться переводить перед поиском в Google!).
- То же, что и выше, но вместо текстового сообщения укажите
ValidationException<ValidationEnum>
, где ValidationEnum
- это Enum, который описывает ошибку для предметной модели.
Это дает вызывающему контексту полную свободу в интерпретации ошибки. Я склоняюсь к этому методу, хотя он загрязняет код огромным количеством перечисляемых значений.
Есть ли другие варианты, кроме тех, которые более красивы?