Данные аннотации или валидация вручную в сервисах? - PullRequest
9 голосов
/ 20 сентября 2010

Каждый раз, когда я начинаю работать над новым веб-приложением ASP.NET MVC, я не уверен, стоит ли использовать проверку DataAnnotations. Что-то в этом не так.

Например, допустим, у меня есть UserService, которому передано CreateUserModel от действия Create AccountController. Чтобы пользователь всегда предоставлял имя, я установил свойство модели Name, чтобы оно имело атрибут [Required]. Теперь я в безопасности, зная, что связыватель модели никогда не даст мне CreateUserModel, если у него нет имени.

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

Итак, мой вопрос: какова наилучшая практика в этой ситуации? Проверить с аннотациями данных и повторить эту проверку в службах? Проверять только в сервисах и выкидывать исключения? Смесь обоих?

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

Ответы [ 3 ]

7 голосов
/ 23 сентября 2010

Я выполняю всю свою проверку на уровне обслуживания, используя комбинацию ручных проверок (если x == y) и использование аннотаций данных.

Чтобы использовать аннотации данных на уровне сервисов, вы должны вручную использовать класс Validator , используя метод TryValidateObject().Хороший пример этого можно увидеть здесь .

Затем вы должны передать свои ошибки валидации с вашего уровня обслуживания на ваш контроллер, и ваш контроллер должен добавить каждую ошибку в список ошибок состояния модели.

1 голос
/ 20 сентября 2010

Лично я бы не возражал, что все проверяется дважды, если логика определена в одном месте, что явно имеет место в вашей ситуации.Я не достаточно опытен, чтобы много говорить о MVC, но я могу себе представить, что создание исключений из уровня обслуживания просто не даст пользовательского опыта (UX), который так же хорош, как то, что MVC может дать вам при проверке (это может дляНапример, рядом с текстовым полем отображается сообщение об ошибке, которое является недопустимым. Это гораздо сложнее сделать при создании исключений из уровня службы).Когда UX одинаков, выполняйте проверку только в службе, в противном случае - в обоих слоях.

1 голос
/ 20 сентября 2010

Вы правы, вам следует отключить проверку на контроллере и выполнить проверку на уровне обслуживания.Вы все еще можете использовать DataAnnotations, если хотите.Сервисный уровень может выдать исключение с сообщениями проверки, контроллер может перехватить это исключение и добавить сообщения проверки в ModelState.Этого можно избежать для каждого действия, обработав исключение проверки для метода OnException контроллера.

...